【发布时间】:2021-12-27 00:47:50
【问题描述】:
我有以下疑问:
SELECT
Id,
EmailDomain,
COUNT(Users) AS UserCount
FROM
Table_Moragn
GROUP BY
Id, EmailDomain
返回以下结果:
| Id | EmailDomain | UserCount |
|---|---|---|
| 1 | @yahoo.com | 1 |
| 1 | @gmail.com | 4 |
| 2 | @hotmail.com | 1 |
| 3 | @aol.com | 1 |
| 3 | @comcast.com | 1 |
我需要 Id 和电子邮件域以供以后查询,但我不想要多个电子邮件域。所以我希望我的结果看起来像这样:
| Id | EmailDomain | UserCount |
|---|---|---|
| 1 | @gmail.com | 4 |
| 2 | @hotmail.com | 1 |
原来我想通过子查询或通过来进行最大计数
SELECT
Id,
EmailDomain,
COUNT(Users) AS UserCount
FROM
Table_Morgan
GROUP BY
Id, EmailDomain
HAVING
COUNT(Users) = (SELECT MAX(UserCount)
FROM (EmailDomain, COUNT(Users) as UserCount
FROM Table_Morgan
GROUP BY EmailDomain) AS T)
但我得到一个错误
不使用EXISTS引入子查询时,选择列表中只能指定一个表达式
或者说它不能用 = 返回多个结果。
我在 ID 3 等情况下看到的一个问题,其中计数是相同的数字。
我尝试在查询末尾添加 LIMIT,但 SQL 不喜欢它。
【问题讨论】:
-
您可以使用窗口函数
dense_rank()列并按 UserCount desc 排序以及您希望如何排序电子邮件,然后按该列过滤 = 1 -
id = 3 怎么样?
-
我不明白你是如何得到这个结果的。似乎您为 ID 1 显示了一行(可能是用户数较高的那个?),为 ID 2 显示了一行(只有一个),为 ID 3 显示了一行(因为您不喜欢 aol 和 comcast?)。请解释你的规则。