【发布时间】:2021-01-27 09:45:47
【问题描述】:
我有一个用户事务表,其中包含用户 ID、日期、项目 ID、价格和 prev_day_price 列。 示例是:
| userid | date | itemid | price | prev_day_price |
|---|---|---|---|---|
| 1 | 2020-12-26 | archicad | 1400.0 | |
| 1 | 2020-12-26 | archicad | 1400.0 | |
| 1 | 2020-12-24 | archicad | 1200.0 | |
| 1 | 2020-12-23 | archicad | 1240.0 | |
| 1 | 2020-12-23 | archicad | 1240.0 | |
| 1 | 2020-12-21 | archicad | 1100.0 |
我需要找到每件商品的前一天(最后一天)价格。我想应用滞后功能,但也想应用 group by,这样我就可以通过 userid 和 itemid 找到以前的价格。因为我的桌子有些日子有一个以上的行\按项目的价格,它不会在 24-12-2020 - 25-12-2020 - 26-12-2020 继续。
| userid | date | itemid | price | prev_day_price |
|---|---|---|---|---|
| 1 | 2020-12-26 | archicad | 1400.0 | |
| 1 | 2020-12-26 | archicad | 1400.0 |
现在,它开始让我对使用延迟功能感到困惑和融化。在更新 prev_day_price 列之前,我尝试按滞后函数查看预览结果:
SELECT*,
lag(price) OVER (PARTITION BY itemid, date, userid) AS prev_day_price
FROM userlog
但结果是:
| userid | date | itemid | price | prev_day_price | prev_day_price |
|---|---|---|---|---|---|
| 1 | 2020-12-21 | archicad | 1100.0 | ||
| 1 | 2020-12-24 | archicad | 1200.0 | ||
| 1 | 2020-12-24 | archicad | 1200.0 | 1200.0 | |
| 1 | 2020-12-24 | archicad | 1200.0 | 1200.0 | |
| 1 | 2020-12-26 | archicad | 1400.0 | ||
| 1 | 2020-12-26 | archicad | 1400.0 | 1400.0 |
看来我的查询无法正常工作。我想所以我错过了一些重要的事情。我的预期结果如下:
| userid | date | itemid | price | prev_day_price |
|---|---|---|---|---|
| 1 | 2020-12-26 | archicad | 1400.0 | 1200 |
| 1 | 2020-12-26 | archicad | 1400.0 | 1200 |
| 1 | 2020-12-24 | archicad | 1200.0 | 1240 |
| 1 | 2020-12-23 | archicad | 1240.0 | 1100 |
| 1 | 2020-12-23 | archicad | 1240.0 | 1100 |
| 1 | 2020-12-21 | archicad | 1100.0 | 1100 |
我尝试使用 lag(price,1) 而不是 lag(price) 来抵消 0 并将默认设置为 0,但它也不起作用。输出格式不是太重要,只要我最终能把它变成一个数组。我正在使用 Postgres。提前致谢。
【问题讨论】:
标签: postgresql