填写以前的值

时间:2016-01-14 09:11:03

标签: postgresql

让我想象一下,我有一个字段数量,价格,折扣表。这里的一些数量的条目是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 |
+----------+-------+----------+

1 个答案:

答案 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行的行