2017-06-07 5 views
0

SQLに問題があります。私は似たようなものを見つけましたTOPIC、まったく同じではありません。重複する日付を分けたいと思います。たとえば、最初の行はSTART_DATE 2014-08-06とEND_DATE 2014-10-06です。 2行目と3行目の日付は最初の行からこの期間内にあることがわかりますが、私はSTORE_IDINDEX_IDで別々にそれを行う必要があります。価格は内部期間から取られるべきである。私はこのコードを変更することはできません。手伝って頂けますか?行を日付とグループで分けるSQL

私のテーブルには、次のようになります。

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

+2

は '同じことtopic'のように考えて...いや、あなたの質問には、独自の足で立っている必要があります。あなたの質問を編集し、明確な問題文を提供してください。 –

+0

完了しました、私はそれが今明らかであると思います。申し訳ありません – Masher

+0

あなたの期待するOutPutを表示 –

答えて

1
;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 
関連する問題