谁能帮助我理解此SQL代码?

时间:2020-09-17 14:29:27

标签: mysql sql

我是SQL新手,但熟悉Python。我正在尝试将此代码导入Python,但我想了解它首先捕获的是哪种数据...

有人可以向我解释此查询的作用吗?特别是LAG,OVER和PARTITION BY函数吗?非常感谢!

SELECT y.id, y.obs_date, y.imp_vol, LAG (obs_date,1) 
    over (Partition by id ORDER BY y.obs_date asc) as prev_obs_date, LAG (y.imp_vol,1) 
    over (partition by id ORDER BY y.obs_date asc) as prev_imp_vol,imp_vol - LAG (y.imp_vol,1) 
    over (partition by id ORDER BY y.obs_date asc) as absolute_change                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
FROM DMX.MDS_RS_OBS_EQUITY_VOL y                                                                                                                                                                                                                                            
WHERE y.obs_date > sysdate - 15                                                                                                                                                                                                                                              
ORDER BY id desc, obs_date desc

1 个答案:

答案 0 :(得分:0)

LAG用于检索先前的值。 OVER部分指定窗口(将其视为主表的子表)。 当谈论前一个值时,您不想比较多个ID,因此您可以按ID进行PARTITION。这样,每个“子表”都包含一个ID。

当您谈论先前的值时,排序也很重要,这就是ORDER BY所解决的问题。您可以通过obs_date对每个包含单个ID的“子表”进行排序。

列别名解释了查询的作用。

  • prev_obs_date-上一个obs_date(对于current_id)
  • prev_imp_vol-上一个imp_vol(针对current_id)
  • absolute_change-当前imp_vol与 之前的imp_vol

LAG(x,1)中的1指定是前一个值,相距1。如果您有一个包含1,2,3,4,5的表,则滞后将返回不同的属性

id  LAG(id,1)   LAG(id,2)   LAG(id,3)
1   NULL        NULL        NULL
2   1           NULL        NULL
3   2           1           NULL
4   3           2           1
5   4           3           2