从 GROUP BY 中获取具有 NULL 列的行
Posted
技术标签:
【中文标题】从 GROUP BY 中获取具有 NULL 列的行【英文标题】:Get the row with a NULL column from GROUP BY 【发布时间】:2021-12-31 05:45:52 【问题描述】:如何从下面的查询中获取address_1
中具有null
值的行。
SELECT id, address_1, address_2, address_3 FROM table GROUP BY address_2, address_3 HAVING COUNT(id) > 1;
在所有分组中,address_1
中只有一行具有 null
值。
id address_1 address_2 address_3
-----------------------------------
1 7 Orange High County CA 10020
2 High County CA 10020
3 20 Orange High County CA 10020
4 True Avenue VA 24019
5 100 Apple True Avenue VA 24019
6 123 Apple True Avenue VA 24019
7 Long Island NY 10000
...
我想获取第 2 行和第 4 行的 id(以相应地更新或删除它)。
【问题讨论】:
请同时包含起始数据。 @TimBiegeleisen 刚刚用更多数据更新了表格。 如果您选择非聚合列,这个查询是如何工作的? 另外,你能澄清一下你想要的结果是什么吗?您是否要选择 address_1 为空的所有行,但前提是它们属于大小 >=1 的组,按 address_2、address_3 分组?还是别的什么? 我只想获得 id=2 和 id=4。 id=7 不会包含在GORUP BY .. HAVING COUNT(id) > 1
分组中。
【参考方案1】:
对于此示例数据,您可以使用条件聚合:
SELECT MAX(CASE WHEN address_1 IS NULL THEN id END) id
FROM tablename
GROUP BY address_2, address_3
HAVING COUNT(address_1) > 0 AND COUNT(address_1) < COUNT(*);
请参阅demo。
【讨论】:
是的!条件聚合解决问题”【参考方案2】:要找到这样的id
值,您可以使用:
SELECT id
FROM yourTable t1
WHERE address_1 IS NULL AND
EXISTS (SELECT 1 FROM yourTable t2
WHERE t2.address_2 = t1.address_2 AND
t2.address_3 = t1.address_3 AND
t2.id <> t1.id AND
t2.id IS NOT NULL);
Demo
【讨论】:
如何不排除 id=7? id=7 不会包含在GORUP BY .. HAVING COUNT(id) > 1
分组中。
@tarako 当然,检查上面的更新答案。
它有效,但我使用 group by 寻找类似于 forpas 的答案。【参考方案3】:
SELECT id, address_1, address_2, address_3
FROM table
WHERE address_1 IS NULL
group by address_2,address_3;
如果每一组中address_1
中只有一行为空值,则无需分组。
这是你需要的吗?还是我没听懂?
【讨论】:
行包含空地址_1在其分组中没有排在第一位时将不起作用。 我编辑了我的答案,看看你是不是这个意思? 我想通过使用 GROUP BY .. HAVING COUNT(id) > 1 分组从结果中排除 id=7 之类的数据。以上是关于从 GROUP BY 中获取具有 NULL 列的行的主要内容,如果未能解决你的问题,请参考以下文章
SQL选择列的总和最大的行(在GROUP BY中有两个字段)