동일한 데이터를 저장하는 여러 레이어가있는 데이터웨어 하우스를 구축하고 있습니다. 중간 계층 중 하나의 모든 데이터는 시작 및 종료 날짜가 버전 2로 느리게 변경되는 것처럼 버전이 지정됩니다. 이 테이블을 쿼리 할 때 문제가 발생합니다. 일반적으로 쿼리의 테이블보다 더 많은 열이 있으므로 쿼리의 인접한 버전은 시작일과 종료일이 다르지만 동일하지 않습니다. 이 버전을 결합하여 테이블의 행이 변경되지 않을 때 쿼리의 열이 변경된 날짜를 표시하려고합니다.SQL을 사용하여 천천히 변하는 유형 2에서 중복을 제거합니다.
create table versions
(id int
, name varchar(100) Not null
, RowStartDate datetime Not null
, RowEndDate datetime Not null
, primary key (id,RowStartDate)
, check (RowStartDate < RowEndDate));
insert into versions values
(1,'A','2014-01-01','9999-12-31')
,(2,'B','2014-01-01','2014-12-31')
,(2,'B','2014-12-31','9999-12-31')
,(3,'C','2014-01-01','2014-12-31')
,(3,'CC','2014-12-31','2015-12-31')
,(3,'CC','2015-12-31','9999-12-31')
,(4,'D','2014-01-01','2014-12-31')
,(4,'DD','2014-12-31','2015-12-31')
,(4,'DD','2015-12-31','2016-12-31')
,(4,'D','2016-12-31','9999-12-31')
,(5,'E','2014-01-01','2014-12-31')
,(5,'E','2014-12-31','2015-12-31')
,(5,'E','2015-12-31','2016-12-31')
,(5,'E','2016-12-31','2017-12-31')
,(5,'E','2017-12-31','9999-12-31')
;
WITH CTE_detect_duplicates AS (SELECT [id]
,[name]
,[RowStartDate]
,[RowEndDate]
,LAST_VALUE(RowEndDate) OVER (PARTITION BY id, name ORDER BY RowStartDate, RowEndDate ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) as LastEndDate
,rank() OVER (PARTITION BY id, name ORDER BY RowStartDate, RowEndDate) as duplicateNumber
FROM versions
)
SELECT [id]
,[name]
,[RowStartDate]
,LastEndDate as RowEndDate
FROM CTE_detect_duplicates
WHERE duplicateNumber = 1
여기서 문제는이 ID가 "4"에 대한 두 개의 행을 반환하고, 세 원할 때
은 거의 작동 일부 SQL 있습니다. 실제 :
id name RowStartDate RowEndDate 4 D 2014-01-01 00:00:00.000 9999-12-31 00:00:00.000 4 DD 2014-12-31 00:00:00.000 2016-12-31 00:00:00.000희망 :
id name RowStartDate RowEndDate 4 D 2014-01-01 00:00:00.000 2014-12-31 00:00:00.000 4 DD 2014-12-31 00:00:00.000 2016-12-31 00:00:00.000 4 D 2016-12-31 00:00:00.000 9999-12-31 00:00:00.000DD 값이 정확한 기간에 대해 값 D가 올바르지 않으므로 버전 쿼리 날짜가 내 쿼리의 첫 번째 행 (4, 'D')에서 올바르지 않습니다.
순수 SQL 또는 인라인 테이블 값 함수에서 이러한 중복을 제거 할 수 있기를 원합니다.이 작업은 다중 명령문 테이블 값 함수를 생성하지만 결과 함수는 제대로 수행되지 않습니다. 누구든지 아이디어가 있습니까?