Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подскажите как сделать правильно insert  [new]
Вя4еслаw
Member

Откуда:
Сообщений: 69
Добрый день,
Подскажите, как правильнее сделать.
Сервер - Microsoft SQL Server 2008 R2 (SP2) .
Есть две таблицы #t1 основная #t2 та из которой берем новые данные.

	CREATE TABLE #t1 ( number_pl varchar(10),region varchar(2), date_create datetime, dateintegration datetime)
			INSERT INTO #t1 
				VALUES
					('01_0042','30','2016-10-01','2003-01-01'),
					('01_0042','30','2016-09-01','2007-01-01'),
					('11_0041','50','2016-10-01','2007-01-01'),
					('11_0041','50','2016-09-01','2012-01-01')

		CREATE TABLE #t2 ( number_pl varchar(10),region varchar(2), date_create datetime, dateintegration datetime)
			INSERT INTO #t2 
				VALUES
					('01_0042','30','2016-11-01','2013-01-01'),
					('11_0041','50','2016-11-01','2004-01-01')


Мне нужно добавить в #t1 данные с минимальной датой поля dateintegration


В итоге должно появиться в таблице :
('01_0042','30','2016-11-01','2003-01-01'),
('11_0041','50','2016-11-01','2004-01-01')



Как правильно при добавлении в таблицу выбирать нужные даты? не могу сообразить(
14 фев 17, 11:00    [20210007]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
buven
Member

Откуда:
Сообщений: 792
Вя4еслаw,

Выбрать строки с минимальным значением уже смогли?
14 фев 17, 11:04    [20210025]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8725
Вя4еслаw,

2016-10-01 так не пишите, пишите 20161001. Потом будут удивляться, что месяц и день поменялись местами.
Чтобы добавить минимальное надо что сделать, как Вы считаете?
14 фев 17, 11:12    [20210055]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
Вя4еслаw
Member

Откуда:
Сообщений: 69
Владислав Колосов,

На самом деле не знаю, мне нужно сравнить значение в исходной таблице и из которой берем данные и добавить запись с минимальной датой и единственное что в голову приходило , это уже после инсерта апдейтить поле, но это ерунда какая-то.
14 фев 17, 11:18    [20210074]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
iap
Member

Откуда: Москва
Сообщений: 47107
Владислав Колосов
2016-10-01 так не пишите, пишите 20161001
Либо имзменить тип на DATE (если время не нужно).
Для него 2016-10-01 всегда понимается однозначно.
14 фев 17, 11:19    [20210078]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
iap
Member

Откуда: Москва
Сообщений: 47107
Вя4еслаw
Владислав Колосов,

На самом деле не знаю, мне нужно сравнить значение в исходной таблице и из которой берем данные и добавить запись с минимальной датой и единственное что в голову приходило , это уже после инсерта апдейтить поле, но это ерунда какая-то.
Во-первых, применить INSERT ... SELECT
Во-вторых, упорядочить в SELECT по возрастанию даты
В-третьих взять первые записи с равными датами (а в первой-то записи как раз минимальная дата получится, верно?).

Однако, надо же ещё проверять, не вставились ли эти записи в прошлый раз?
14 фев 17, 11:23    [20210094]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Merge https://msdn.microsoft.com/en-us/library/bb510625.aspx
Мин дату как вытащить, было 5 темами ниже https://www.sql.ru/forum/1249930/pomogite-s-zaprosom-gde-nuzhno-vybrat-poslednuu-ocenku-po-kazhdomu-ucheniku
14 фев 17, 11:26    [20210105]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
welter
Member

Откуда:
Сообщений: 38
Вя4еслаw
Добрый день,
Подскажите, как правильнее сделать.
Сервер - Microsoft SQL Server 2008 R2 (SP2) .
Есть две таблицы #t1 основная #t2 та из которой берем новые данные.

	CREATE TABLE #t1 ( number_pl varchar(10),region varchar(2), date_create datetime, dateintegration datetime)
			INSERT INTO #t1 
				VALUES
					('01_0042','30','2016-10-01','2003-01-01'),
					('01_0042','30','2016-09-01','2007-01-01'),
					('11_0041','50','2016-10-01','2007-01-01'),
					('11_0041','50','2016-09-01','2012-01-01')

		CREATE TABLE #t2 ( number_pl varchar(10),region varchar(2), date_create datetime, dateintegration datetime)
			INSERT INTO #t2 
				VALUES
					('01_0042','30','2016-11-01','2013-01-01'),
					('11_0041','50','2016-11-01','2004-01-01')


Мне нужно добавить в #t1 данные с минимальной датой поля dateintegration


В итоге должно появиться в таблице :
('01_0042','30','2016-11-01','2003-01-01'),
('11_0041','50','2016-11-01','2004-01-01')



Как правильно при добавлении в таблицу выбирать нужные даты? не могу сообразить(



Не совсем понял постановку, предположу, что в #t1 нужно добавить все записи из #t2, в которых dateintegration < min(dateintegration) в #t1
алгоритм:
1. Мин дата в #t1 : select @dateintegration = min(dateintegration) from #t1
2. insert into #t1(..)
select *from #t2 where dateintegration < @dateintegration
14 фев 17, 11:32    [20210129]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
aleksrov
Member

Откуда:
Сообщений: 948
welter,

Это не взлетит
14 фев 17, 11:34    [20210139]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
Вя4еслаw
Member

Откуда:
Сообщений: 69
Я думал сделать вот так, но не уверен что так правильно :
		
			select number_pl,
				   region,
				   MIN(dateintegration) dateintegration 
				  
				   
			 from (
					select number_pl,region, MIN(dateintegration) dateintegration from #t1 
						group by number_pl,region
					
					union ALL 
					
					select number_pl,region, MIN(dateintegration) dateintegration from #t2
						group by number_pl,region
				  )t
			group by number_pl,region
			

а date_create потом поставить самому
14 фев 17, 11:38    [20210156]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
welter
Member

Откуда:
Сообщений: 38
aleksrov
welter,

Это не взлетит


как всегда безапеляыионно....

declare @t1 TABLE( number_pl varchar(10),region varchar(2), date_create datetime, dateintegration datetime)
INSERT INTO @t1
VALUES
('01_0042','30','2016-10-01','2003-01-01'),
('01_0042','30','2016-09-01','2007-01-01'),
('11_0041','50','2016-10-01','2007-01-01'),
('11_0041','50','2016-09-01','2012-01-01')

declare @t2 TABLE( number_pl varchar(10),region varchar(2), date_create datetime, dateintegration datetime)
INSERT INTO @t2
VALUES
('01_0042','30','2016-11-01','2013-01-01'),
('11_0041','50','2016-11-01','2004-01-01')

declare
@dateintegration datetime

select @dateintegration = MIN(dateintegration) from @t1
select @dateintegration

insert into @t1
select * from @t2 where @dateintegration < @dateintegration

select * from @t1
14 фев 17, 11:51    [20210197]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
welter,

О_о теперь точно взлетит
автор
@dateintegration < @dateintegration


автор
безапеляыионно
14 фев 17, 11:54    [20210204]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
iap
Member

Откуда: Москва
Сообщений: 47107
Не говоря о том, что вставить таким образом первую запись невозможно.
Ибо MIN вернёт NULL
14 фев 17, 11:56    [20210215]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
Вя4еслаw
Member

Откуда:
Сообщений: 69
welter

Не совсем понял постановку, предположу, что в #t1 нужно добавить все записи из #t2, в которых dateintegration < min(dateintegration) в #t1
алгоритм:
1. Мин дата в #t1 : select @dateintegration = min(dateintegration) from #t1
2. insert into #t1(..)
select *from #t2 where dateintegration < @dateintegration



Чуть чуть не так, Мы вставляем все записи в #t1 (даже если сочитания number_pl + region раньше не было)
условие такое , что нужно во вставляемую запись выбрать dateintegration минимальный из двух таблиц. в итоге должны в #t1 должны добавится записи со значением поля dateintegration:
'2003-01-01' для '30' region
и
'2004-01-01' для '50' region
14 фев 17, 12:02    [20210240]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
aleksrov
Member

Откуда:
Сообщений: 948
MERGE t1 AS target  
    USING (select *
  from (
         select t.*, row_number() 
                           over(partition by number_pl, region order by dateintegration desc) as rn
           from t2
       ) v
 where rn = 1) AS source (number_pl, region, date_create, dateintegration)  
    ON (t1.number_pl = t2.number_pl and t1.region=t2.region)
    WHEN MATCHED and source.dateintegration < target.dateintegration 
THEN update set  target.dateintegration =   source.dateintegration 
   WHEN MATCHED and  target.dateintegration < source.dateintegration 
THEN update  source.dateintegration =  target.dateintegration 
WHEN NOT MATCHED THEN  
    INSERT (number_pl, region, date_create, dateintegration)  
    VALUES (t2.number_pl, t2.region, t2.date_create, t2.dateintegration)  
    OUTPUT deleted.*, $action, inserted.* INTO #MyTempTable;


Как то так, писал быстро, могут быть ошибки.
14 фев 17, 12:17    [20210283]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
greeninsania
Member

Откуда:
Сообщений: 2
Добрый день. Подскажите, пожалуйста, а в каком случае '2016-10-01' может интерпретироваться сервером в формате ydm (2016 год, 10 день, 01 месяц), то есть, месяц и день поменяются местами?
Спасибо.

Владислав Колосов
Вя4еслаw,

2016-10-01 так не пишите, пишите 20161001. Потом будут удивляться, что месяц и день поменялись местами.
Чтобы добавить минимальное надо что сделать, как Вы считаете?
19 апр 17, 12:18    [20413880]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как сделать правильно insert  [new]
iap
Member

Откуда: Москва
Сообщений: 47107
greeninsania,

тип - DATETIME, SMALLDATETIME и т.п. (если DATE, - всегда поймёт однозначно правильно)
и если выполнить SET DATEFORMAT ydm или в коннекте сменить язык, для которого сначала день, потом месяц.
Последний случай - очень типичный.
Сервер может находиться в одной стране, а пользователи - в разных других странах.
19 апр 17, 13:21    [20414269]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить