Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将大型价格表转换为具有startdate和enddate的表_Sql_Sql Server - Fatal编程技术网

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