【发布时间】:2022-01-12 10:25:35
【问题描述】:
我有一个表,我将几个表连接在一起后得到,它看起来像这样:
SELECT TOP(200)
A.Value as value,readDate,symbol,description,VIN
FROM Table1 as V
JOIN Table2 ON Table2.VX_Id=V.VX_Id
JOIN Table3 ON Table3.FX_Id =Table2.FX_Id
JOIN Table4 on Table3.FX_Id=Table4.FX_Id
JOIN Table5 as A on A.RX_Id=Table4.RX_Id
WHERE symbol='SV'
ORDER BY VIN,readDate
value readDate symbol description VIN
------ --------------------- ----- ---------- ------
105 2013-02-05 15:17:25.000 SV text1 C92320
120 2013-02-05 15:25:25.000 SV text2 C92320
234 2013-01-22 06:17:55.000 SV text3 F45910
240 2013-01-23 07:20:55.000 SV text4 F45910
246 2013-01-23 09:20:55.000 SV text5 F45910
1500 2015-10-24 12:48:38.000 SV text6 J20920
337 2014-01-24 11:58:38.000 SV text7 P20824
我想计算下一个值和上一个值的差值(有这个差值的新列):
value difference readDate symbol description VIN
------ ---- --------------------- ----- ---------- ------
105 NULL 2013-02-05 15:17:25.000 SV text1 C92320
120 15 2013-02-05 15:25:25.000 SV text2 C92320
234 114 2013-01-22 06:17:55.000 SV text3 F45910
240 6 2013-01-23 07:20:55.000 SV text4 F45910
246 6 2013-01-23 09:20:55.000 SV text5 F45910
1500 1254 2015-10-24 12:48:38.000 SV text6 J20920
337 -1163 2014-01-24 11:58:38.000 SV text7 P20824
我可以通过写作得到这张表:
SELECT TOP(200)
A.Value as value,A.Value-LAG(A.Value, 1) OVER (ORDER BY VIN,readDate) as
difference,readDate,symbol,description,VIN
FROM Table1 as V
JOIN Table2 ON Table2.VX_Id=V.VX_Id
JOIN Table3 ON Table3.FX_Id =Table2.FX_Id
JOIN Table4 on Table3.FX_Id=Table4.FX_Id
JOIN Table5 as A on A.RX_Id=Table4.RX_Id
WHERE symbol='SV'
我只对来自相同 VIN 号的正数差异感兴趣,所以我不会对 114 (as C92320->F45910) 或 1254 (as F45910->J20920) 感兴趣。所以我想要的表看起来像:
value difference readDate symbol description VIN
------ ---- --------------------- ----- ---------- ------
105 NULL 2013-02-05 15:17:25.000 SV text1 C92320
120 15 2013-02-05 15:25:25.000 SV text2 C92320
234 NULL 2013-01-22 06:17:55.000 SV text3 F45910
240 6 2013-01-23 07:20:55.000 SV text4 F45910
246 6 2013-01-23 09:20:55.000 SV text5 F45910
1500 NULL 2015-10-24 12:48:38.000 SV text6 J20920
337 NULL 2014-01-24 11:58:38.000 SV text7 P20824
有没有办法做到这一点?
【问题讨论】:
-
你需要
PARTITION你的LAG,那么你似乎只需要一个CASE表达式。 -
@Larnu 我是 SQL 新手,如果您能更深入地解释一下,将不胜感激..
-
@Larnu 好的!我在 ORDER BY 之前添加了 PARTITION BY VIN,这是正确的吗?
-
这就是文档所说的地方。
标签: sql-server window-functions