CASE WHEN 和 WHERE

CASE WHEN with WHERE

我想根据 CASE WHEN 语句中的条件为与 user_id 关联的其他行分配一个值。

step3,旅程有所不同。因此,当 step = 'step3_eu' 时,我想创建一个名为 type 的列,并为与该 user_id 关联的行分配 'Category 2',否则 'Category 1'.

示例数据如下:

+---------+----------+---------------------+
| user_id |   step   |     created_at      |
+---------+----------+---------------------+
| 7bc6de  | step1    | 2021-01-13 08:47:39 |
| 7bc6de  | step2    | 2021-01-14 06:12:30 |
| 7bc6de  | step3    | 2021-01-18 07:29:16 |
| 7bc6de  | step4    | 2021-01-18 11:10:08 |
| 7bc6de  | step5    | 2021-01-19 08:31:30 |
| 0ee6df  | step1    | 2021-02-08 23:31:55 |
| 0ee6df  | step2    | 2021-02-12 19:50:53 |
| 0ee6df  | step3_eu | 2021-02-13 00:04:34 |
| 0ee6df  | step4    | 2021-02-18 16:42:41 |
| 0ee6df  | step5    | 2021-02-22 08:52:30 |
+---------+----------+---------------------+

这是所需的输出:

+---------+----------+---------------------+------------+
| user_id |   step   |     created_at      |    type    |
+---------+----------+---------------------+------------+
| 7bc6de  | step1    | 2021-01-13 08:47:39 | Category 1 |
| 7bc6de  | step2    | 2021-01-14 06:12:30 | Category 1 |
| 7bc6de  | step3    | 2021-01-18 07:29:16 | Category 1 |
| 7bc6de  | step4    | 2021-01-18 11:10:08 | Category 1 |
| 7bc6de  | step5    | 2021-01-19 08:31:30 | Category 1 |
| 0ee6df  | step1    | 2021-02-08 23:31:55 | Category 2 |
| 0ee6df  | step2    | 2021-02-12 19:50:53 | Category 2 |
| 0ee6df  | step3_eu | 2021-02-13 00:04:34 | Category 2 |
| 0ee6df  | step4    | 2021-02-18 16:42:41 | Category 2 |
| 0ee6df  | step5    | 2021-02-22 08:52:30 | Category 2 |
+---------+----------+---------------------+------------+

demo:db<>fiddle

SELECT 
    *,
    CASE 
       WHEN bool_or(step = 'step3_eu') OVER (PARTITION BY user_id) THEN 'Category 2'
       ELSE 'Category 1'
    END as type
FROM mytable

您可以使用 bool_or() window function。这将检查组内是否有值为 step3_eu 的记录(= user_id 的分区)。