누락 된 간격을 얻으려면 몇 가지 방법이 있습니다. 매주 (또는 7 일) 날짜가 있고 경우에 따라 날짜가없는 것처럼 보입니다. 따라서 while 루프를 사용하여 날짜 테이블을 만들고 조인을 수행하고 테이블에서 null이있을 때 Stock Opening Balance를 0으로 설정하면됩니다. 여기에 비슷한 테이블 변수를 사용하고 있습니다.하지만 임시 테이블을 사용하는 것이 더 나을 것입니다. 만약 당신이 2 테이블을 필요로하지 않는다면 임시 테이블에 누락을 삽입하십시오.
DECLARE @TableWithGaps AS TABLE ([Date] DATE, StockOpeningBalance INT)
INSERT INTO @TableWithGaps ([Date],StockOpeningBalance)
VALUES ('2016-04-04',10)
,('2016-04-11',6)
,('2016-04-18',2)
,('2016-05-09',7)
,('2016-05-16',4)
,('2016-05-23',3)
DECLARE @Dates AS TABLE ([Date] DATE)
DECLARE @MinDate DATE = '3/28/2016'
DECLARE @MaxDate DATE = '6/20/2016'
--Could also get first record as minimum date and last record, or set @maxdate = GETDATE()
--SELECT @MinDate = DATEADD(DAY,7,MIN([Date])), @MaxDate = MAX([Date]) FROM @TableWithGaps
WHILE @MinDate < DATEADD(DAY,1,@MaxDate)
BEGIN
INSERT INTO @Dates ([Date]) VALUES (@MinDate)
SET @MinDate = DATEADD(DAY,7,@MinDate)
END
SELECT
d.[Date]
,StockOpeningBalance = ISNULL(StockOpeningBalance,0)
,LAG(ISNULL(StockOpeningBalance,0),1,0) OVER (ORDER BY d.[Date])
,Movements = ISNULL(StockOpeningBalance,0) - LAG(ISNULL(StockOpeningBalance,0),1,0) OVER (ORDER BY d.[Date])
FROM
@Dates d
LEFT JOIN @TableWithGaps s
ON d.[Date] = s.[Date]
또한 테이블 변수보다 임시 테이블을 선호하며 임시 테이블은 더 큰 데이터 세트에서 더 잘 수행됩니다. 날짜가있는 톤을 시작하면 이와 같은 목적으로 날짜 차원 테이블을 볼 수 있습니다. Microsoft SSAS를 사용하는 경우 Google SSH를 사용할 수있는 도구가 내장되어있어 매우 빠르게 검색 할 수 있습니다.
안녕하세요 Matt 저에게 다시 연락해 주셔서 감사합니다. 귀하가 제안한 것을 구현하고 내가 어떻게 시작하는지 알려 드리겠습니다! –
희망이 있습니다. 조금만 변경하면 데이터 세트/날짜 범위가 큰 경우 성능이 향상 될 것입니다. – Matt
@Rob_Heat 내 대답에 해결책이 있다면 받아 들여주세요. 나는 지역 사회를 도우려고이 일을하고 있지만 명성을 높이기를 원합니다. 감사!. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Matt