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 |
+---------+----------+---------------------+------------+
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
的分区)。
我想根据 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 |
+---------+----------+---------------------+------------+
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
的分区)。