让我想象一下,我有一个字段数量,价格,折扣表。这里的一些数量的条目是0相应的价格和折扣变为0.我想知道如何将前一行的值复制到具有条目0的行的价格和折扣,这样数量将是0但价格和折扣永远不会是0。 同样...! I / P:
+----------+-------+----------+
| quantity | price | discount |
+----------+-------+----------+
| 12 | 360 | 10 |
| 0 | 0 | 0 |
| 3 | 90 | 5 |
| 0 | 0 | 0 |
+----------+-------+----------+
预期产出:
+----------+-------+----------+
| quantity | price | discount |
+----------+-------+----------+
| 12 | 360 | 10 |
| 0 | 360 | 10 |
| 3 | 90 | 5 |
| 0 | 90 | 5 |
+----------+-------+----------+
答案 0 :(得分:0)
如果要访问上一行,可以使用LAG
功能:
> SELECT * FROM t;
┌────┬──────────┬───────┬──────────┐
│ id │ quantity │ price │ discount │
├────┼──────────┼───────┼──────────┤
│ 1 │ 12 │ 360 │ 10 │
│ 2 │ 0 │ 0 │ 0 │
│ 3 │ 3 │ 90 │ 5 │
│ 4 │ 0 │ 0 │ 0 │
└────┴──────────┴───────┴──────────┘
> SELECT quantity,
CASE price
WHEN 0 THEN LAG(price) OVER (ORDER BY id)
ELSE price
END,
CASE discount
WHEN 0 THEN LAG(discount) OVER (ORDER BY id)
ELSE discount
END
FROM t;
┌──────────┬───────┬──────────┐
│ quantity │ price │ discount │
├──────────┼───────┼──────────┤
│ 12 │ 360 │ 10 │
│ 0 │ 360 │ 10 │
│ 3 │ 90 │ 5 │
│ 0 │ 90 │ 5 │
└──────────┴───────┴──────────┘
(4 rows)
请注意,这只会抓取上一行,而不是之前的“非零”行,因此您可能仍会得到0
和/或discount
price
行的行