从 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) &gt; 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 列的行的主要内容,如果未能解决你的问题,请参考以下文章

从 GROUP BY 组中选择具有特定内容的行

使用 GROUP BY 后查找具有 MAX 值的行

SQL选择列的总和最大的行(在GROUP BY中有两个字段)

通过 group by 和 joins 获取多个表的多个列的总和

选择所有具有 GROUP BY 一列的列[重复]

MYSQL GROUP BY 具有特定列的值对