簡體   English   中英

按日期和組SQL划分行

[英]Divide rows by date and by group SQL

我在使用SQL時遇到問題。 我發現了一個相似的主題 ,但並不完全相同。 我想分開重疊的日期。 例如,我在第一行START_DATE 2014-08-06和END_DATE 2014-10-06中。 我們可以看到第二排和第三排的日期在第一排的這段時間之內,但是我必須分別在STORE_IDINDEX_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_IDINDEX_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM