使用startdate和enddate将大价格表转换为表

时间:2015-10-16 13:42:09

标签: sql sql-server

我有一张表格,其中包含每个日期每篇文章的价格以及大量冗余:即使价格没有变化,我仍然会为每个日期添加一行。我想要做的是将此表格转换为一个表格,对于每个不同的价格,将会有一个新行,其中 startdate enddate

来源示例:

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。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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

如果价格变回以前的值,这将无法正常工作。如果这是一个机会,您将不得不运行一个程序代码循环,同时价格保持不变并跟踪开始和结束日期。