Jiv*_*van 2 postgresql time-series window-functions rolling-computation
我想知道是否可以在 Postgresql 中使用基于时间的窗口查询。
\n原始数据位于前三列(日期、销售员、金额):
\n| 日期 | 推销员 | 数量 | 3 滚动天数总和 |
|---|---|---|---|
| 2020-01-01 | 约翰 | 10 | 10 |
| 2020-01-02 | 约翰 | 15 | 25 |
| 2020-01-03 | 约翰 | 8 | 33 |
| 2020-01-04 | 约翰 | 12 | 35 |
| 2020-01-05 | 约翰 | 11 | 31 |
| 2020-01-01 | 丹尼尔 | 5 | 5 |
| 2020-01-02 | 丹尼尔 | 6 | 11 |
| 2020-01-03 | 丹尼尔 | 7 | 18 |
| 2020-01-04 | 丹尼尔 | 8 | 21 |
| 2020-01-05 | 丹尼尔 | 9 | 24 |
第四列表示该销售员在过去三个滚动日内的总金额。
\nPandas 有内置函数可以做到这一点,但我想不出任何方法可以使用内置sum() over ()语法在 Postgresql 中做到这一点。我能够做到的唯一方法是使用横向连接和子查询的复杂组合以及时间增量比较的条件,至少可以说这是不优雅的。
Pandas\' 方式(根据记忆,确切的语法可能略有不同) \xe2\x80\x94 无法获得任何简洁的信息:
\ndf.groupby(\'salesman\').rolling(\'3d\').sum()\nRun Code Online (Sandbox Code Playgroud)\n
SELECT
*,
SUM(amount) OVER (
PARTITION BY salesman -- 1
ORDER BY "date" -- 2
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW -- 3
)
FROM mytable
Run Code Online (Sandbox Code Playgroud)
salesman。因此,以下操作仅在这些分区内完成date按列排序如果您使用的是 Postgres 11RANGE或更高版本,您可以使用日期间隔而不是计数来更精确地定义窗口ROWS:
SELECT
*,
SUM(amount) OVER (
PARTITION BY salesman
ORDER BY "date"
RANGE BETWEEN interval '2 days' PRECEDING AND CURRENT ROW
)
FROM mytable
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2717 次 |
| 最近记录: |