Sql 将大型价格表转换为具有startdate和enddate的表
我有一个表格,上面有每篇文章每一天的价格,有很多冗余:即使价格没有变化,我仍然有一行每一天。我想做的是将此表转换为一个表,其中对于每个不同的价格,都会有一个带有开始日期和结束日期的新行 来源示例:Sql 将大型价格表转换为具有startdate和enddate的表,sql,sql-server,Sql,Sql Server,我有一个表格,上面有每篇文章每一天的价格,有很多冗余:即使价格没有变化,我仍然有一行每一天。我想做的是将此表转换为一个表,其中对于每个不同的价格,都会有一个带有开始日期和结束日期的新行 来源示例: 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
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合作。您需要标识具有相同价格的连续日期行,然后根据生成的标识符分组。获取组的一种更简单的方法是减去一个递增序列,该序列由
row\u number()
生成:
如果您有可能错过日期,则行号的差异会起作用:
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;
你可以试试这个:
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
如果价格更改回以前的值,则此操作将无法正常工作。如果这是一个机会,您将不得不运行一个程序代码,在price保持不变的情况下循环并跟踪开始和结束日期。GROUP BY article\u ID,price?如果一篇文章变回以前的价格怎么办?@jarlh这可能发生,那么应该用新的起始日期创建一个新行:如果第一篇文章的价格在1月4日回到2.99,那么新行的起始日期为04/01/15,价格为2.99。
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