2015-10-16 15 views
2

我有一個表格,每個日期的每篇文章的價格都有很多冗餘:即使價格沒有變化,我仍然會爲每個日期分配一行。我想要做的是將這個表格轉換成一個表格,其中對於每個不同的價格,將會有一個新行開始日期結束日期將大型價格表轉換爲帶有開始日期和結束日期的表格

來源例如:

article_ID date  price 
1   01/01/15 2.99 
1   02/01/15 2.99 
1   03/01/15 2.49 
2   01/01/15 12.29 
2   02/01/15 12.29 
2   03/01/15 12.29 

我正在尋找一個SQL查詢來創建以下結果:

article_ID startdate enddate price 
1   01/01/15 02/01/15 2.99 
1   03/01/15 03/01/15 2.49 
2   01/01/15 03/01/15 12.49 

我與SQL Server和Oracle SQL Developer中工作。

+0

GROUP BY article_ID,價格?如果文章變回以前的價格會怎樣? – jarlh

+0

@jarlh可能發生這種情況,那麼應該用新的開始日期創建一個新行:如果第1條的價格在1月4日回到2.99,那麼新行的開始日期爲04/01/15,價格爲2.99。 – kirvis

回答

0

您需要用相同的價格標識連續日期的行,然後對結果標識符進行分組。更簡單的方法來獲得該集團減去增加的順序,由row_number()產生:如果你錯過了日期的可能性

select article_id, min(date) as startdate, max(date) as enddate, price 
from (select s.*, 
      dateadd(day, 
        - row_number() over (partition by article_id, price 
              order by date 
             ) 
        date) as grp 
     from source s 
    ) s 
group by grp, article_id, price; 

,再行數的差下工作:

select article_id, min(date) as startdate, max(date) as enddate, price 
from (select s.*, 
      (row_number() over (partition by article_id order by date) - 
       row_number() over (partition by article_id, price order by date) 
      ) as grp 
     from source s 
    ) s 
group by grp, article_id, price; 
0

你可以試試這個:

INSERT INTO destinationtable (article_ID,startdate,enddate.price) 
    SELECT article_ID, MIN(date) AS startdate, MAX(date) AS enddate, price 
    FROM sourcetable 
    GROUP BY article_ID, price 

如果價格變回以前的值,這將無法正常工作。如果這是一個機會,您將不得不運行一個程序代碼,該代碼在價格保持不變的情況下循環,並跟蹤開始日期和結束日期。

相關問題