如何按user_id统计各字段是否存在至少一条approved记录?
问题描述
我有一张名为user_due_diligence的表,结构包含user_id、cellphone、national_id、postal_code字段,现有数据如下:
| user_id | cellphone | national_id | postal_code |
|---|---|---|---|
| 5 | approved | in_progress | in_progress |
| 5 | in_progress | approved | not_investigated |
| 5 | approved | not_investigated | not_investigated |
需要按user_id分组,每个user_id仅返回一行记录,各字段用1表示该字段存在至少一条approved记录,用0表示不存在。期望结果如下:
| user_id | cellphone | national_id | postal_code |
|---|---|---|---|
| 5 | 1 | 1 | 0 |
已知需要用到group by user_id和case when x = "approved"语句,但不清楚具体语法,请问该如何实现?
解决方案
可以结合GROUP BY和聚合函数MAX()来实现需求,用CASE WHEN判断字段是否存在approved记录,再通过聚合函数提取最终的标识值。具体SQL语句如下:
SELECT user_id, MAX(CASE WHEN cellphone = 'approved' THEN 1 ELSE 0 END) AS cellphone, MAX(CASE WHEN national_id = 'approved' THEN 1 ELSE 0 END) AS national_id, MAX(CASE WHEN postal_code = 'approved' THEN 1 ELSE 0 END) AS postal_code FROM user_due_diligence GROUP BY user_id;
语句说明:
CASE WHEN 字段 = 'approved' THEN 1 ELSE 0 END:对每条记录的对应字段做判断,值为approved就标记1,否则标记0。MAX()聚合函数:按user_id分组后,只要分组内有至少一个1(即该字段存在过approved记录),MAX()就会保留1;如果全是0,就返回0,刚好匹配“存在至少一条approved则为1,否则为0”的要求。GROUP BY user_id:保证每个用户只在结果中出现一行。
内容的提问来源于stack exchange,提问作者Martin AJ
相关产品推荐
相关产品推荐

