Sql server SQL Server 2008:计算日期和价格变化

Sql server SQL Server 2008:计算日期和价格变化,sql-server,tsql,Sql Server,Tsql,我有一个SQLServer2008表,有3列:art_id、date和price。价格不时地变化。日期不是连续的 如何计算每个艺术id的价格变化时间和变化幅度?使用带有MIN的自联接 然后,使用此结果集,您可以使用LEAD或LAG(如果您在2012+上)计算价格变化,或者使用带有CTE的窗口函数ROW_编号。如果需要更多说明,请指定您使用的版本。类似于: DECLARE @artSales TABLE (artid int, dt date, price money); INSERT @art

我有一个SQLServer2008表,有3列:art_id、date和price。价格不时地变化。日期不是连续的

如何计算每个艺术id的价格变化时间和变化幅度?

使用带有MIN的自联接

然后,使用此结果集,您可以使用LEAD或LAG(如果您在2012+上)计算价格变化,或者使用带有CTE的窗口函数ROW_编号。如果需要更多说明,请指定您使用的版本。

类似于:

DECLARE @artSales TABLE (artid int, dt date, price money);

INSERT @artSales
VALUES 
(1, '20170102', 10), (1, '20170108', 10), (1, '20170112', 8.50), (1, '20170115', 8.50),
(2, '20170102', 20), (2, '20170109', 20), (2, '20170112', 35), (2, '20170116', 40),
(3, '20170101', 500), (3, '20170111', 500), (3, '20170130', 500);

SELECT 
  artid,
  dt,
  oldPrice = price,
  PriceChange =
  CASE 
    LAG(price, 1, price) OVER (PARTITION BY artid ORDER BY dt) 
    WHEN price THEN 0 ELSE 1
  END,
  NewPrice = LAG(price, 1, price) OVER (PARTITION BY artid ORDER BY dt)
FROM @artSales;
结果:

artid       dt         oldPrice              PriceChange NewPrice
----------- ---------- --------------------- ----------- ---------------------
1           2017-01-02 10.00                 0           10.00
1           2017-01-08 10.00                 0           10.00
1           2017-01-12 8.50                  1           10.00
1           2017-01-15 8.50                  0           8.50
2           2017-01-02 20.00                 0           20.00
2           2017-01-09 20.00                 0           20.00
2           2017-01-12 35.00                 1           20.00
2           2017-01-16 40.00                 1           35.00
3           2017-01-01 500.00                0           500.00
3           2017-01-11 500.00                0           500.00
3           2017-01-30 500.00                0           500.00
更新-对于2012年之前的系统:


添加一些数据样本和预期结果。还有,到目前为止你试过什么?您需要实际价格和以前的最新价格吗?价格如何变化?这个表中是一个新记录还是一个更新?这看起来是一个完美的解决方案,唯一的问题是我使用的是sql 2008。很抱歉没有提前提及。我更新了我的解决方案,加入了一种无延迟或无引导的方法。谢谢您的回复。我使用sql 2008,不能使用滞后或超前。
artid       dt         oldPrice              PriceChange NewPrice
----------- ---------- --------------------- ----------- ---------------------
1           2017-01-02 10.00                 0           10.00
1           2017-01-08 10.00                 0           10.00
1           2017-01-12 8.50                  1           10.00
1           2017-01-15 8.50                  0           8.50
2           2017-01-02 20.00                 0           20.00
2           2017-01-09 20.00                 0           20.00
2           2017-01-12 35.00                 1           20.00
2           2017-01-16 40.00                 1           35.00
3           2017-01-01 500.00                0           500.00
3           2017-01-11 500.00                0           500.00
3           2017-01-30 500.00                0           500.00
WITH prev AS
(
  SELECT rn = ROW_NUMBER() OVER (PARTITION BY artid ORDER BY dt), *
  FROM @artSales
)
SELECT 
  as1.artid,
  as1.dt,
  OldPrice    = as1.price,
  PriceChange = CASE WHEN as1.price <> as2.price THEN 1 ELSE 0 END,
  NewPrice    = ISNULL(as2.price, as1.price)
FROM prev as1
LEFT JOIN prev as2 ON as1.artid = as2.artid AND as1.rn = as2.rn+1;