Pandas的[df.groupby(...)['col_name'].shift(1)]的SQL等效语句是什么?

7

我有一段代码,想将其转换为SQL语句。有人知道相应的SQL代码是什么样子吗?

lags = range(1, 5)
df = df.assign(**{
    '{}{}'.format('lag', t): df.groupby('article_id').num_views.shift(t) for t in lags
})

更新:

我正在寻找符合SQL标准方言的语言。 这里是一个数据集示例(前10行部分):

  article_id section time   num_views   comments
0   abc111b     A   00:00   15            0
1   abc111b     A   01:00   36            0
2   abc111b     A   02:00   36            0
3   bbbddd222hf A   03:00   41            0
4   bbbddd222hf B   04:00   44            0
5   nnn678www   B   05:00   39            0
6   nnn678www   B   06:00   38            0
7   nnn678www   B   07:00   66            0
8   nnn678www   C   08:00   65            0
9   nnn678www   C   09:00   87            1

1
请提供一个小的可复现的样本数据集。同时,请指明您所询问的是哪种SQL方言... - MaxU - stand with Ukraine
我更新了我的问题。 - user8436761
1个回答

8
您可以使用SQL-99 ANSI标准中的“窗口函数”之一——LAG()函数
select
  article_id, section, time, num_views, comments,
  lag(num_views, 1, 0) over(partition by article_id order by article_id, time) as lag1,
  lag(num_views, 2, 0) over(partition by article_id order by article_id, time) as lag2,
  lag(num_views, 3, 0) over(partition by article_id order by article_id, time) as lag3,
  lag(num_views, 4, 0) over(partition by article_id order by article_id, time) as lag4
from tab;

这里是完整且可用的SQLFiddle示例...

PS 请注意,并非所有RDBMS系统都实现了"窗口函数"


无法快速编写,很抱歉 :) - zipa
@MaxU 太好了,谢谢!只有一个小问题 - 如果我想创建50个滞后,我该如何在循环中执行它,以便我不必为每个滞后重复相同的代码? - user8436761
@user8436761,只需使用任何编程语言(例如Python)动态生成您的SQL即可。 - MaxU - stand with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接