[英]Divide rows by date and by group SQL
我在使用SQL時遇到問題。 我發現了一個相似的主題 ,但並不完全相同。 我想分開重疊的日期。 例如,我在第一行START_DATE 2014-08-06和END_DATE 2014-10-06中。 我們可以看到第二排和第三排的日期在第一排的這段時間之內,但是我必須分別在STORE_ID
和INDEX_ID
。 價格應取自內部期間。 我無法修改此代碼。 你能幫助我嗎?
我的桌子看起來像這樣:
declare @t table (STORE_ID INT,
INDEX_ID INT,
START_DATE datetime,
END_DATE datetime,
GROSS_SALES_PRICE decimal(10,2)
);
insert into @t
values (1,20,'2014-08-06 00:00:00.000', '2014-10-06 23:59:59.000', 29.99),
(1,20,'2014-09-06 00:00:00.000', '2014-09-09 23:59:59.000', 32.99),
(1,20,'2014-09-10 00:00:00.000', '2014-09-30 23:59:59.000', 32.99),
(1,20,'2014-10-07 00:00:00.000', '2049-12-31 23:59:59.000', 34.99),
(1,22,'2014-08-06 00:00:00.000', '2014-10-06 23:59:59.000', 29.99),
(1,22,'2014-09-06 00:00:00.000', '2014-09-09 23:59:59.000', 32.99),
(1,22,'2014-09-10 00:00:00.000', '2014-09-30 23:59:59.000', 32.99),
(1,22,'2014-10-07 00:00:00.000', '2049-12-31 23:59:59.000', 34.99),
(2,20,'2014-08-06 00:00:00.000', '2014-10-06 23:59:59.000', 29.99),
(2,20,'2014-09-06 00:00:00.000', '2014-09-09 23:59:59.000', 32.99),
(2,20,'2014-09-10 00:00:00.000', '2014-09-30 23:59:59.000', 32.99),
(2,20,'2014-10-07 00:00:00.000', '2049-12-31 23:59:59.000', 34.99)
和所需的輸出:
declare @t2 table (STORE_ID INT,
INDEX_ID INT,
START_DATE datetime,
END_DATE datetime,
GROSS_SALES_PRICE decimal(10,2)
);
insert into @t2
values (1,20,'2014-08-06 00:00:00.000', '2014-09-05 23:59:59.000', 29.99),
(1,20,'2014-09-06 00:00:00.000', '2014-09-09 23:59:59.000', 32.99),
(1,20,'2014-09-10 00:00:00.000', '2014-09-30 23:59:59.000', 32.99),
(1,20,'2014-10-01 00:00:00.000', '2014-10-06 23:59:59.000', 29.99),
(1,20,'2014-10-07 00:00:00.000', '2049-12-31 23:59:59.000', 34.99),
(1,22,'2014-08-06 00:00:00.000', '2014-09-05 23:59:59.000', 29.99),
(1,22,'2014-09-06 00:00:00.000', '2014-09-09 23:59:59.000', 32.99),
(1,22,'2014-09-10 00:00:00.000', '2014-09-30 23:59:59.000', 32.99),
(1,22,'2014-10-01 00:00:00.000', '2014-10-06 23:59:59.000', 29.99),
(1,22,'2014-10-07 00:00:00.000', '2049-12-31 23:59:59.000', 34.99),
(2,20,'2014-08-06 00:00:00.000', '2014-09-05 23:59:59.000', 29.99),
(2,20,'2014-09-06 00:00:00.000', '2014-09-09 23:59:59.000', 32.99),
(2,20,'2014-09-10 00:00:00.000', '2014-09-30 23:59:59.000', 32.99),
(2,20,'2014-10-01 00:00:00.000', '2014-10-06 23:59:59.000', 29.99),
(2,20,'2014-10-07 00:00:00.000', '2049-12-31 23:59:59.000', 34.99)
因此,代碼應該像我所附的主題中那樣工作,但是應該在每個STORE_ID
和INDEX_ID
上分別進行INDEX_ID
。
;WITH Preprocessed AS (
SELECT STORE_ID, INDEX_ID, START_DATE, END_DATE,
NEXT_START_DATE = FIRST_VALUE(START_DATE) OVER (PARTITION BY STORE_ID, INDEX_ID ORDER BY START_DATE ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING),
MAX_END_DATE = MAX(END_DATE) OVER(PARTITION BY STORE_ID, INDEX_ID ORDER BY START_DATE ROWS UNBOUNDED PRECEDING)
FROM @t
)
SELECT
STORE_ID, INDEX_ID, START_DATE,
END_DATE_NEW = IIF(NEXT_START_DATE IS NOT NULL AND NEXT_START_DATE < END_DATE, DATEADD(SECOND, -1, NEXT_START_DATE), END_DATE)
FROM Preprocessed
UNION ALL
SELECT STORE_ID, INDEX_ID,
START_DATE = DATEADD(SECOND, 1, END_DATE),
END_DATE = IIF(NEXT_START_DATE < MAX_END_DATE, DATEADD(SECOND, -1, NEXT_START_DATE), MAX_END_DATE)
FROM Preprocessed
WHERE (NEXT_START_DATE IS NULL OR NEXT_START_DATE > DATEADD(SECOND, 1, END_DATE)) -- End of the range
AND (END_DATE < MAX_END_DATE) -- Check if need to add new record after range
ORDER BY 1, 2, 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.