首页 > 解决方案 > 在字符串列上使用 GROUP BY 时未获得分组结果

问题描述

我有一个收件箱表,我想在其中返回按他们的电话号码分组的消息(如发件人的 GMail 组)。并且 sms_content 应该是 id 的最后一条消息。但是当我使用 GROUP BY 关键字时,它不会返回分组结果。

这是我的“收件箱”表。应该对来自号码“+123456789”的 2 条消息进行分组。

+----+--------------+------------------------------+
| id | phone_number |         sms_content          |
+----+--------------+------------------------------+
|  1 | +123456789   | Hello, my name is            |
|  2 | +987654321   | What's up, long time no see! |
|  3 | +123456789   | John, I want to meet you!    |
+----+--------------+------------------------------+

我的第一个查询失败并出现此错误消息

select * from inbox group by phone_number

错误:查询错误:错误:列“inbox.id”必须出现在 GROUP BY 子句中或在聚合函数中使用

我尝试的第二个查询没有返回按电话号码分组的结果

select *
from inbox
group by phone_number, id, sms_content
order by id desc

结果(未分组):

+----+--------------+------------------------------+
| id | phone_number |         sms_content          |
+----+--------------+------------------------------+
|  3 | +123456789   | John, I want to meet you!    |
|  2 | +987654321   | What's up, long time no see! |
|  1 | +123456789   | Hello, my name is            |
+----+--------------+------------------------------+

我希望看到的结果是这样的。电话号码字段应分组,sms_content 应显示该电话号码的最新 sms_content。

+--------------+------------------------------+
| phone_number |         sms_content          |
+--------------+------------------------------+
| +123456789   | John, I want to meet you!    |
| +987654321   | What's up, long time no see! |
+--------------+------------------------------+

标签: sqlpostgresql

解决方案


对于这种情况,PostgreSQL 有一个有用的标准扩展:

SELECT DISTINCT ON (phone_number)
       phone_number,
       sms_content
FROM inbox
ORDER BY phone_number, id DESC

详情

SELECT DISTINCT ON ( expression [, ...] )仅保留给定表达式计算结果等于的每组行的第一行。

样品小提琴


推荐阅读