Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Заполнить временные разрывы в SCD-таблице..  [new]
Santa89
Member

Откуда:
Сообщений: 1526
Есть табличка в которой храниться история перемещения сотрудника по различным должностям:

declare @t table
(
Сотрудник varchar(50),
Должность varchar(50),
Дата_Начала date,
Дата_Окончания date,
Замещающая_Должность bit
)

insert into @t
select 'Иванова', 'Бухгалтер','2011-05-01','2011-05-31',0 union all
select 'Иванова', 'Бухгалтер','2011-06-01',null,0 union all
-- пошли замещающие должности
select 'Иванова', 'Бухгалтер-кассир','2013-06-01','2013-07-09',1 union all
select 'Иванова', 'Бухгалтер-кассир','2013-07-19','2013-07-28',1 union all
select 'Иванова', 'Бухгалтер-кассир','2013-09-23','2013-09-30',1


Самое главное - что время от времени сотрудник может уходить со своей должности на замещающую (замещать кого-либо),
к сожалению выгрузка из справочной системы не строит красивую SCD (Slowly_Changed_Dimension) - витрину, а просто выдает периоды замещения.

Нужно добиться такого результата, чтобы никаких временных "дыр" по любому из сотрудников не было, примерно так, как на вложенном скриншоте, синяя линия указывает связь между датами, вобщем такая же структура как в нормально SCD-витрине. Нужно искусственно вставлять строчки с не замещающей должностью которая является ближайшей к замещающей. Прошу помочь, пытаюсь что то собрать уже второй день, но никак не получается...

К сообщению приложен файл. Размер - 56Kb
23 июл 14, 09:35    [16344840]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
11111117777777
Guest
Это очень сложно , сам пытался много времени потратьил, но работает...
Сейчас ищу свои исходники нарою скину тебе
23 июл 14, 09:53    [16344914]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
Santa89
Member

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

Спасибо! да, сложновато, ломаю голову!

пока примерно прикинул так - идти циклом по замещающим должностям и для каждой такой должности искать - с какой "нормальной" должности пришел сотрудник на эту замещающую. и вставлять данные по этой нормальной (основной) должности после замещающей..
23 июл 14, 09:57    [16344937]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
11111117777777
Guest
пока примерно прикинул так - идти циклом по замещающим должностям и для каждой такой должности искать - с какой "нормальной" должности пришел сотрудник на эту замещающую. и вставлять данные по этой нормальной (основной) должности после замещающей..


Я тоже мыслю с вами в том же направлении.... Так и делал.....
23 июл 14, 10:01    [16344970]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
11111117777777
Guest
Что-то хлама у меня на компе полно, сори немогу отыскать, кидайте свой набросок я вам помогу
23 июл 14, 10:03    [16344980]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
Santa89
Member

Откуда:
Сообщений: 1526
declare @t table
(
[] int identity (1,1), 
Сотрудник varchar(50),
Должность varchar(50),
Дата_Начала date,
Дата_Окончания date,
Замещающая_Должность bit
)

insert into @t
select 'Иванова', 'Бухгалтер','2011-05-01','2011-05-31',0 union all
select 'Иванова', 'Бухгалтер','2011-06-01',null,0 union all
-- пошли замещающие должности
select 'Иванова', 'Бухгалтер-кассир','2013-06-01','2013-07-09',1 union all
select 'Иванова', 'Бухгалтер-кассир','2013-07-19','2013-07-28',1 union all
select 'Иванова', 'Бухгалтер-кассир','2013-09-23','2013-09-30',1

select * 
from @t


declare @i int = 1

while @i <= (select max([]) from @t)
begin
		
		-- Поиск основной (нормальной) должности, с которой сотрудник пришел на замещающую должность
		select [] from @t
		where Сотрудник = (select Сотрудник from @t where [] = @i) and Замещающая_Должность = 0 and datediff(.......


set @i = @i + 1
end


вот на этом datediff я застрял...
надо найти ближайшую к текущей в цикле замещающей должности "нормальную" должность.
с расставлением дат для этой должности которая будет искуственно вставлена уже будет попроще.

цикл будет идти только по замещающим должностям
23 июл 14, 10:18    [16345081]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
Santa89
Member

Откуда:
Сообщений: 1526
Чтобы последнее мной написанное выполнялось в основной цикл конечно же нужно вставить IF:

		if (select Замещающая_Должность from @t where [] = @i) = 1

		begin
				-- Поиск основной (нормальной) должности, с которой сотрудник пришел на замещающую должность
				select [] from @t
				where Сотрудник = (select Сотрудник from @t where [] = @i) and Замещающая_Должность = 0
		end
23 июл 14, 10:30    [16345136]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
11111117777777
Guest
Santa89
declare @t table
(
[] int identity (1,1), 
Сотрудник varchar(50),
Должность varchar(50),
Дата_Начала date,
Дата_Окончания date,
Замещающая_Должность bit
)

insert into @t
select 'Иванова', 'Бухгалтер','2011-05-01','2011-05-31',0 union all
select 'Иванова', 'Бухгалтер','2011-06-01',null,0 union all
-- пошли замещающие должности
select 'Иванова', 'Бухгалтер-кассир','2013-06-01','2013-07-09',1 union all
select 'Иванова', 'Бухгалтер-кассир','2013-07-19','2013-07-28',1 union all
select 'Иванова', 'Бухгалтер-кассир','2013-09-23','2013-09-30',1

select * 
from @t


declare @i int = 1

while @i <= (select max([]) from @t)
begin
		
		-- Поиск основной (нормальной) должности, с которой сотрудник пришел на замещающую должность
		select [] from @t
		where Сотрудник = (select Сотрудник from @t where [] = @i) and Замещающая_Должность = 0 and datediff(.......


set @i = @i + 1
end


вот на этом datediff я застрял...
надо найти ближайшую к текущей в цикле замещающей должности "нормальную" должность.
с расставлением дат для этой должности которая будет искуственно вставлена уже будет попроще.

цикл будет идти только по замещающим должностям



что то мне подсказывает, что разница в днях должна быть не нулевой, если идет поиск по текущей основно должности, это нас сразу отсылает на правильные рельсы

-- Поиск основной (нормальной) должности, с которой сотрудник пришел на замещающую должность
select [№] from @t
where Сотрудник = (select Сотрудник from @t where [№] = @i) and Замещающая_Должность = 0 and
datediff(
day,
SELECT MIN(Дата_Начала) FROM @t.Дата_Начала ,
SELECT MAX(Дата_Окончания) FROM @t.Дата_Окончания
) >= 1
23 июл 14, 11:43    [16345682]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
11111117777777
Guest
11111117777777
Santa89
declare @t table
(
[] int identity (1,1), 
Сотрудник varchar(50),
Должность varchar(50),
Дата_Начала date,
Дата_Окончания date,
Замещающая_Должность bit
)

insert into @t
select 'Иванова', 'Бухгалтер','2011-05-01','2011-05-31',0 union all
select 'Иванова', 'Бухгалтер','2011-06-01',null,0 union all
-- пошли замещающие должности
select 'Иванова', 'Бухгалтер-кассир','2013-06-01','2013-07-09',1 union all
select 'Иванова', 'Бухгалтер-кассир','2013-07-19','2013-07-28',1 union all
select 'Иванова', 'Бухгалтер-кассир','2013-09-23','2013-09-30',1

select * 
from @t


declare @i int = 1

while @i <= (select max([]) from @t)
begin
		
		-- Поиск основной (нормальной) должности, с которой сотрудник пришел на замещающую должность
		select [] from @t
		where Сотрудник = (select Сотрудник from @t where [] = @i) and Замещающая_Должность = 0 and datediff(.......


set @i = @i + 1
end


вот на этом datediff я застрял...
надо найти ближайшую к текущей в цикле замещающей должности "нормальную" должность.
с расставлением дат для этой должности которая будет искуственно вставлена уже будет попроще.

цикл будет идти только по замещающим должностям



что то мне подсказывает, что разница в днях должна быть не нулевой, если идет поиск по текущей основно должности, это нас сразу отсылает на правильные рельсы

-- Поиск основной (нормальной) должности, с которой сотрудник пришел на замещающую должность
select [№] from @t
where Сотрудник = (select Сотрудник from @t where [№] = @i) and Замещающая_Должность = 0 and
datediff(
day,
SELECT MIN(Дата_Начала) FROM @t.Дата_Начала ,
SELECT MAX(Дата_Окончания) FROM @t.Дата_Окончания
) >= 1




но для этого надо создать временную табличку или вложить эту временную табличку в этом же запросе, а в эту табличку поместить даты периодов замещения по текущему сотруднику не замещаемой должности....
23 июл 14, 11:47    [16345715]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
11111117777777
Guest
11111117777777
11111117777777
пропущено...



что то мне подсказывает, что разница в днях должна быть не нулевой, если идет поиск по текущей основно должности, это нас сразу отсылает на правильные рельсы

-- Поиск основной (нормальной) должности, с которой сотрудник пришел на замещающую должность
select [№] from @t
where Сотрудник = (select Сотрудник from @t where [№] = @i) and Замещающая_Должность = 0 and
datediff(
day,
SELECT MIN(Дата_Начала) FROM @t.Дата_Начала ,
SELECT MAX(Дата_Окончания) FROM @t.Дата_Окончания
) >= 1




но для этого надо создать временную табличку или вложить эту временную табличку в этом же запросе, а в эту табличку поместить даты периодов замещения по текущему сотруднику не замещаемой должности....


datediff(
day,
SELECT Дата_Начала FROM @t.Дата_Начала ,
SELECT Дата_Окончания FROM @t.Дата_Окончания ) >= 1

мы ведь перебераем посторочно а не все разом
23 июл 14, 11:55    [16345747]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
FireFoxy
Guest
11111117777777
11111117777777
пропущено...




но для этого надо создать временную табличку или вложить эту временную табличку в этом же запросе, а в эту табличку поместить даты периодов замещения по текущему сотруднику не замещаемой должности....


datediff(
day,
SELECT Дата_Начала FROM @t.Дата_Начала ,
SELECT Дата_Окончания FROM @t.Дата_Окончания ) >= 1

мы ведь перебераем посторочно а не все разом


please look here https://en.wikipedia.org/wiki/Slowly_changing_dimension
23 июл 14, 12:02    [16345786]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
mittagswind
Member

Откуда:
Сообщений: 136
можно нагенерить измерение времени (если вы оперируете понятиями OLAP, наверняка у вас оно уже должно быть) и сделать к нему join:

declare @date_start date = '20100101'

create table #dimDate(DateKey date)
create table #scd([Сотрудник] varchar(50), [Должность] varchar(50), [Дата_Начала] date, [Дата_Окончания] date, [Замещающая_Должность] bit)

insert into #scd([Сотрудник], [Должность], [Дата_Начала], [Дата_Окончания], [Замещающая_Должность])
select 'Иванова', 'Бухгалтер','2011-05-01','2011-05-31',0 union all
select 'Иванова', 'Бухгалтер','2011-06-01',null,0 union all
-- пошли замещающие должности
select 'Иванова', 'Бухгалтер-кассир','2013-06-01','2013-07-09',1 union all
select 'Иванова', 'Бухгалтер-кассир','2013-07-19','2013-07-28',1 union all
select 'Иванова', 'Бухгалтер-кассир','2013-09-23','2013-09-30',1

-- генерация таблицы измерения времени
insert #dimDate(DateKey)
select dateadd(day, row_number() over (order by c.rw_no) - 1, @date_start) from
(select top 5000 1 as rw_no 
	from sys.columns as c1
	cross join sys.columns as c2
) c

select * from #scd

select scd.[Сотрудник], scd.[Должность], d.DateKey [Рабочий день], [Замещающая_Должность]
	from #scd as scd
	join #dimDate as d
		on scd.[Дата_Начала] <= d.DateKey and isnull(scd.[Дата_Окончания], getdate()) >= d.DateKey


drop table #dimDate
drop table #scd
23 июл 14, 13:46    [16346567]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
Wlr-l
Member

Откуда:
Сообщений: 606
mittagswind, и сделать к нему (#dimDate) join:

declare @date_start date = '20110430', @date_finish date = '20131001'

create table #dimDate(DateKey date)
create table #scd([Сотрудник] varchar(50), [Должность] varchar(50), [Дата_Начала] date, [Дата_Окончания] date, [Замещающая_Должность] bit)

insert into #scd([Сотрудник], [Должность], [Дата_Начала], [Дата_Окончания], [Замещающая_Должность])
select 'Иванова', 'Бухгалтер','20110501','20110531',0 union all
select 'Иванова', 'Бухгалтер','20110601',null,0 union all
-- пошли замещающие должности
select 'Иванова', 'Бухгалтер-кассир','20130601','20130709',1 union all
select 'Иванова', 'Бухгалтер-кассир','20130719','20130728',1 union all
select 'Иванова', 'Бухгалтер-кассир','20130923','20130930',1

-- генерация таблицы измерения времени
insert #dimDate(DateKey)
select dateadd(day, row_number() over (order by c.rw_no) - 1, @date_start) from
(select top 5000 1 as rw_no 
	from sys.columns as c1
	cross join sys.columns as c2
) c

select * from #scd

select d.DateKey [Рабочий день], a.[Сотрудник]
      ,a.[Должность] as [Должность-основная], a.Дата_Начала, a.Дата_Начала
      ,b.[Должность] as [Должность-замещения], b.Дата_Начала, b.Дата_Начала
      
  from      #dimDate as d
  left join #scd     as a on a.[Дата_Начала]<=d.DateKey and isnull(a.[Дата_Окончания], getdate())>=d.DateKey
                        and a.[Замещающая_Должность]=0
  left join #scd     as b on b.[Дата_Начала]<=d.DateKey and isnull(b.[Дата_Окончания], getdate())>=d.DateKey
                        and b.[Замещающая_Должность]=1
 where DateKey between @date_start and @date_finish;

drop table #dimDate
drop table #scd


Кроме того, Иванова работала в одно и то же время на основной должности
select 'Иванова', 'Бухгалтер','20110601',null,0
и замещающей, например,
select 'Иванова', 'Бухгалтер-кассир','20130601','20130709',1
23 июл 14, 15:03    [16347226]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
aleks2
Guest
declare @t table
(
[] int identity (1,1), 
Сотрудник varchar(50),
Должность varchar(50),
Дата_Начала date,
Дата_Окончания date,
Замещающая_Должность bit
)

insert into @t
select 'Иванова', 'Бухгалтер','2011-05-01','2011-05-31',0 union all
select 'Иванова', 'Бухгалтер','2011-06-01',null,0 union all
-- пошли замещающие должности
select 'Иванова', 'Бухгалтер-кассир','2013-06-01','2013-07-09',1 union all
select 'Иванова', 'Бухгалтер-кассир','2013-07-19','2013-07-28',1 union all
select 'Иванова', 'Бухгалтер-кассир','2013-09-23','2013-09-30',1

select * 
from @t

declare @t2 table
(
[] int identity (1,1), 
Сотрудник varchar(50),
Должность varchar(50),
Дата_Начала date,
Дата_Окончания date,
Замещающая_Должность bit
)

insert @t2
select Сотрудник, Должность, Дата_Начала, Дата_Окончания, Замещающая_Должность  from @t
union all
select t1.Сотрудник, null, t1.Дата_Окончания, null, 0 
  from @t t1 
  where not exists( select * from @t tt1 where tt1.Сотрудник = t1.Сотрудник and t1.Дата_Окончания = tt1.Дата_Начала )
        and t1.Дата_Окончания is not null
order by Сотрудник, Дата_Начала;

select * from @t2

update t2 set Должность = ( select top(1) Должность from @t2 tt2 
                              where tt2.Должность is not null and tt2.Сотрудник = t2.Сотрудник and tt2.Дата_Начала < t2.Дата_Начала order by Дата_Начала desc ) 
            , Дата_Окончания = ( select top(1) Дата_Начала from @t2 tt2 
                                   where tt2.Сотрудник = t2.Сотрудник and tt2.Дата_Начала > t2.Дата_Начала order by Дата_Начала asc )  
  from @t2 t2
  where t2.Должность is null
  
select * from @t2
23 июл 14, 15:19    [16347359]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
Как-то так без новомодных LEAD.
declare @t table
(
Сотрудник varchar(50),Должность varchar(50),Дата_Начала date,Дата_Окончания date,Замещающая_Должность bit
)

declare @t1 table
(
ID int identity(1,1),Сотрудник varchar(50),Должность varchar(50),Дата_Начала date,Дата_Окончания date,Замещающая_Должность bit
)

declare @t2 table
(
ID int identity(1,1),Сотрудник varchar(50),Должность varchar(50),Дата_Начала date,Дата_Окончания date,Замещающая_Должность bit
)

insert into @t values
('Иванова', 'Бухгалтер','2011-05-01','2011-05-31',0),
('Иванова', 'Бухгалтер','2011-06-01',null,0),
-- пошли замещающие должности
('Иванова', 'Бухгалтер-кассир','2013-06-01','2013-07-09',1),
('Иванова', 'Бухгалтер-кассир','2013-07-19','2013-07-28',1),
('Иванова', 'Бухгалтер-кассир','2013-09-23','2013-09-30',1)

insert into @t1 select * from @t order by Дата_Начала

insert into @t2
select Сотрудник, Должность, Дата_Начала, Дата_Окончания, замещающая_должность
from(
	select Сотрудник, Должность, Дата_Начала, Дата_Окончания, замещающая_должность from @t1
	union 
	select t1.Сотрудник, 'Бухгалтер' Должность, dateadd(dd,1,t1.Дата_Окончания) Дата_Начала1, null Дата_Окончания, 0 замещающая_должность
	from @t1 t1
	left join @t1 t2 on t1.id+1 = t2.id
	where dateadd(dd,1,t1.Дата_Окончания) not in (select Дата_Начала from @t1)
) tbl1
order by 3

select t1.Сотрудник, t1.Должность, t1.Дата_Начала, isnull(t1.Дата_Окончания, dateadd(dd,-1,t2.Дата_Начала)) Дата_Окончания, t1.Замещающая_Должность 
from @t2 t1
inner join @t2 t2 on t1.id + 1 = t2.id
order by t1.id
23 июл 14, 16:18    [16347749]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
Wlr-l
Member

Откуда:
Сообщений: 606
Продолжая развивать тему таблиц последовательности дат:

declare @date_start date = '20110430', @date_finish date = '20131001'

create table #dimDate(DateKey date)
create table #scd([Сотрудник] varchar(50), [Должность] varchar(50), [Дата_Начала] date, [Дата_Окончания] date, [Замещающая_Должность] bit)

insert into #scd([Сотрудник], [Должность], [Дата_Начала], [Дата_Окончания], [Замещающая_Должность])
select 'Иванова', 'Бухгалтер','20110501','20110531',0 union all
select 'Иванова', 'Бухгалтер','20110601',null,0 union all
-- пошли замещающие должности
select 'Иванова', 'Бухгалтер-кассир','20130601','20130709',1 union all
select 'Иванова', 'Бухгалтер-кассир','20130719','20130728',1 union all
select 'Иванова', 'Бухгалтер-кассир','20130923','20130930',1

-- генерация таблицы измерения времени
insert #dimDate(DateKey)
select dateadd(day, row_number() over (order by c.rw_no) - 1, @date_start) from
(select top 5000 1 as rw_no 
	from sys.columns as c1
	cross join sys.columns as c2
) c

select * from #scd

;
with A as (
select d.DateKey [Рабочий день], a.[Сотрудник]
      ,case when isnull(b.[Замещающая_Должность],0)=0 then a.[Должность]      else b.[Должность]      end as [Должность]
      ,case when isnull(b.[Замещающая_Должность],0)=0 then a.[Дата_Начала]    else b.[Дата_Начала]    end as [Дата_Начала]
      ,case when isnull(b.[Замещающая_Должность],0)=0 then a.[Дата_Окончания] else b.[Дата_Окончания] end as [Дата_Окончания]
      ,cast(isnull(b.[Замещающая_Должность],0) as tinyint) as [Замещающая_Должность]
  from      #dimDate as d
  left join #scd     as a on a.[Дата_Начала]<=d.DateKey and isnull(a.[Дата_Окончания], getdate())>=d.DateKey
                        and a.[Замещающая_Должность]=0
  left join #scd     as b on b.[Дата_Начала]<=d.DateKey and isnull(b.[Дата_Окончания], getdate())>=d.DateKey
                        and b.[Замещающая_Должность]=1
 where DateKey between @date_start and @date_finish
)
--select * from A;
,B as (
select *
      ,datediff(dd,@date_start,[Рабочий день])-row_number() over (partition by [Дата_Начала] order by [Рабочий день]) as rd
 from A
)
--select * from B order by [Рабочий день];

select [Сотрудник]
      ,min([Рабочий день]) as [c], max([Рабочий день]) as [по]
      ,min([Замещающая_Должность]) as [Замещающая_Должность]
  from B
  group by [Сотрудник],rd
  order by 1,2
;

drop table #dimDate
drop table #scd


Сотрудник	c	по	Замещающая_Должность
NULL 2011-04-30 2011-04-30 0
Иванова 2011-05-01 2011-05-31 0
Иванова 2011-06-01 2013-05-31 0
Иванова 2013-06-01 2013-07-09 1
Иванова 2013-07-10 2013-07-18 0
Иванова 2013-07-19 2013-07-28 1
Иванова 2013-07-29 2013-09-22 0
Иванова 2013-09-23 2013-09-30 1
Иванова 2013-10-01 2013-10-01 0
23 июл 14, 16:31    [16347838]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
Santa89
Member

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

а почему в вашем примере нет последней искуственно - добавленной строчки?

К сообщению приложен файл. Размер - 56Kb
24 июл 14, 03:47    [16349614]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
Santa89
Member

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

также неясна вот эта конструкция. разве при наличии 100 различных должностей для 200 сотрудников это взлетит?

К сообщению приложен файл. Размер - 57Kb
24 июл 14, 03:51    [16349615]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
Santa89
Member

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

К сожалению из вашего скрипта не получиться собрать правильную витрину.
Какая должность у Ивановой на сегодня? (24-07-2014)
Бухгалтер-кассир или бухгалтер? Бухгалтером-кассиром она была только на замещении, основная должность - бухгалтер, последняя же строчка говорит о том что она была бухгалтером-кассиором на замещающей...

К сообщению приложен файл. Размер - 60Kb
24 июл 14, 03:57    [16349617]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
Santa89
Member

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

точнее наоборот, о том, что она была бухгалтером - кассиром на основной должности
24 июл 14, 03:58    [16349619]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
Santa89
Member

Откуда:
Сообщений: 1526
Wlr-l,

отличная идея с джойном таблицы дат. получается гораздо быстрее чем в цикле.
только что то пока у меня не получается сделать последню должность открытой.
по вашему скрипту сотрудник на ней всего один день:

К сообщению приложен файл. Размер - 9Kb
24 июл 14, 04:09    [16349622]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
Santa89
Member

Откуда:
Сообщений: 1526
Изменяя @date_finish в вашем скрипте например на getdate() получим текущую дату.
А что если нужен NULL если должность открыта? При этом нужно не потерять не переходы на должности которые произошли как раз сегодня.
24 июл 14, 04:12    [16349623]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
Santa89
Member

Откуда:
Сообщений: 1526
Wlr-l, mittagswind

также, если есть сотрудники у которых было перемещение в 90х годах, скрипт Wlr-l отрабатывать не будет:


declare
@date_start date = '1992-05-28',
@date_finish date = getdate()
24 июл 14, 04:22    [16349627]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
aleks2
Guest
Santa89
aleks2,

К сожалению из вашего скрипта не получиться собрать правильную витрину.
Какая должность у Ивановой на сегодня? (24-07-2014)
Бухгалтер-кассир или бухгалтер? Бухгалтером-кассиром она была только на замещении, основная должность - бухгалтер, последняя же строчка говорит о том что она была бухгалтером-кассиором на замещающей...


Клиент недоволен! О горе мне!!!

Ну дык, страдалец, допили по фкусу.
24 июл 14, 06:20    [16349647]     Ответить | Цитировать Сообщить модератору
 Re: Заполнить временные разрывы в SCD-таблице..  [new]
Santa89
Member

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

спасибо большое за помощь, сейчас как раз допиливаю
24 июл 14, 06:23    [16349650]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить