我有一张表格,其中包含每个日期每篇文章的价格以及大量冗余:即使价格没有变化,我仍然会为每个日期添加一行。我想要做的是将此表格转换为一个表格,对于每个不同的价格,将会有一个新行,其中 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。
答案 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
如果价格变回以前的值,这将无法正常工作。如果这是一个机会,您将不得不运行一个程序代码循环,同时价格保持不变并跟踪开始和结束日期。