Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / OLAP и DWH Новый топик    Ответить
 SSIS: как сделать такой производный столбец?  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4150
Есть входная таблица (неудобная, но какая есть):
id человека дата дата2 должность
1 02.01.2011 05.05.2011 помощник
1 02.03.2011 05.05.2011 старший программист

1 - это номер человека, таблица описывает то, как он гулял.
02.01.2011 он устроился на работу
02.03.2011 он перешёл в другую должность
02.05.2011 он уволился.

Для всех строк с одинаковым ID дата2 будет одинаковой.

В общем, я хочу это импортировать в свою БД и для этого хотел бы сделать произвольный столбец, который по-человечески бы описывал дату окончания.
id человека дата дата2 должность
1 02.01.2011 01.03.2011 помощник
1 02.03.2011 05.05.2011 старший программист
21 июл 17, 16:19    [20665227]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: как сделать такой производный столбец?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 30760
Блог
Charles Weyland,

в чем сложность найти следующую запись по паре {ID, дата} и сделать "-1"?

https://msdn.microsoft.com/ru-ru/library/hh213125(v=sql.120).aspx
21 июл 17, 16:28    [20665266]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: как сделать такой производный столбец?  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4150
в том, что у меня SQL server 2008 R2,
плюс, хотелось бы знать, как это сделать в SSIS - т.е. до того, как данные попадут в базу.
21 июл 17, 17:05    [20665428]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: как сделать такой производный столбец?  [new]
Yagrus2
Member

Откуда: Москва
Сообщений: 639
А почему так не сделать?
--drop table #t

create table #t 
(
[id человека]	int,
дата	date,
дата2	date,
должность varchar(50)
)
insert into #t values (1,	'02.01.2011',	'05.05.2011',	'помощник')
insert into #t values (1,	'02.03.2011',	'05.05.2011',	'старший программист')

SELECT	F.[id человека],
				F.дата AS ST,
				isnull(S.дата, '20150101') AS ED,
				F.должность
FROM
	(
	SELECT *, ROW_NUMBER() OVER (PARTITION BY [id человека] ORDER BY дата) AS RN
	FROM #t
	) AS F
LEFT JOIN
	(
	SELECT *, ROW_NUMBER() OVER (PARTITION BY [id человека] ORDER BY дата) AS RN
	FROM #t
	) AS S
ON	F.[id человека] = S.[id человека] AND
		F.RN = S.RN-1

Если нужен только SSIS, то воспользуйтесь sql таском
21 июл 17, 17:10    [20665453]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: как сделать такой производный столбец?  [new]
IDVT
Member

Откуда:
Сообщений: 202
create table #table 
(  Id    Int           -- id человека	
 , FDate Date          -- дата1
 , XDate Date          -- дата2
 , Dep   VarChar (36)  -- должность
)
insert into #table 
values ( 1, '02.01.2011', '05.05.2011', 'помощник')
     , ( 1, '02.03.2011', '05.05.2011', 'старший программист')


select Id
     , Fdate
     , lead( DAteAdd( Day
                    , -1
                    , Fdate), 1, XDate)
       over ( partition by Id
              order by FDate)
from #table

drop table #table
21 июл 17, 18:00    [20665582]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: как сделать такой производный столбец?  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4150
спасибо вам за ответы))
про lead вообще не знал, теперь просмотрю, что там нового появилось в последние годы.
И да, я действительно сейчас сделал соответствующий таск в ssis с sql-кодом.

Если вдруг кто-то появится, кто обрисует, как это сделать в блоке скрипта, я был бы счастлив :)
21 июл 17, 19:46    [20665729]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: как сделать такой производный столбец?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 4457
Charles Weyland
Если вдруг кто-то появится, кто обрисует, как это сделать в блоке скрипта, я был бы счастлив :)
не нужно это делать скрипт-компонентом.
вы потеряете на производительности (если это имеет значение).
можно эту задачу решить конечно и скрипт-компонентом и даже обычными тасками дата-флоу (без скрипта),
но всё это будет в разы хуже простого запроса из пары строк, что вам привели выше с lead.
вставляете этот запрос в дестинейшен и понеслась :)
21 июл 17, 21:34    [20665868]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: как сделать такой производный столбец?  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4150
Дедушка,

Спасибо за информацию про производительность. Я сделал запросом. Не lead, конечно (т.к. у меня 2008, а lead доступен с 2012), а с помощью нумерации строк.

Вообще, поскольку данных всё-таки не так много (пара десятков тысяч), и выполняется задача ночью, то производительность вообще не имеет значения. А сделать я такое хотел в познавательных целях.
24 июл 17, 10:32    [20668922]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: как сделать такой производный столбец?  [new]
IDVT
Member

Откуда:
Сообщений: 202
Дедушка, Вам привел не оспоримые аргументы в производительности, + сопровождение....
Если цель академическая, то:

1. Источник данных запрос

select Id
     , Fdate
     , Row_Number()
       over ( partition by Id
              order by FDate) as Num
from #table


2. добавить вычисляемые столбцы (в SSIS) NumM = Num - 1 и FdateM = Fdate - 1 день
3. многоадресная рассылка (поток 1 и поток 2)
4. Left Join потоков по связи [поток 1].Id = [поток 2].ID и [поток 1].Num = [поток 2].NumM
5. Если значение [поток 2].FdateM = null тогда значение [поток 1].XDate иначе [поток 2].FdateM

далее отладите что я упустил,... но к этому лучше не привыкать, сегодня мало данных, через месяц много или еще процессы ETL в одном пакете дадут существенную потерю производительности и затраты на ресурсы.
24 июл 17, 11:03    [20669010]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: как сделать такой производный столбец?  [new]
IDVT
Member

Откуда:
Сообщений: 202
*ошибся с запросом

select Id
     , Fdate
     , XDate
     , Row_Number()
       over ( partition by Id
              order by FDate)  as Num
from #table
24 июл 17, 11:05    [20669015]     Ответить | Цитировать Сообщить модератору
 Re: SSIS: как сделать такой производный столбец?  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4150
Спасибо всем в этом топике за информативное пояснение и различные варианты решений!
24 июл 17, 11:13    [20669052]     Ответить | Цитировать Сообщить модератору
Все форумы / OLAP и DWH Ответить