【问题标题】:How to do MAX COUNT so Query returns 1 Result SQL如何做 MAX COUNT 所以查询返回 1 个结果 SQL
【发布时间】: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?)。请解释你的规则。

标签: sql count max


【解决方案1】:

使用Dense_Rank() 窗口函数也可以显示并列排名。

SELECT   -- main result
  *
FROM (SELECT    -- ranking here
  *,
  DENSE_RANK() OVER (PARTITION BY Id ORDER BY UserCount DESC, EmailDomain) rnk
FROM (SELECT  -- group count here
  Id,
  EmailDomain,
  COUNT(Users) AS UserCount
FROM Table_Moragn
GROUP BY Id,
         EmailDomain) x) y
WHERE y.rnk = 1

【讨论】:

    【解决方案2】:

    您可以在查询中使用MAX()FIRST_VALUE() 窗口函数:

    SELECT DISTINCT Id,
           FIRST_VALUE(EmailDomain) OVER (PARTITION BY Id ORDER BY COUNT(Users) DESC) EmailDomain,
           MAX(COUNT(Users)) OVER (PARTITION BY Id) UserCount
    FROM Table_Moragn
    GROUP BY Id, EmailDomain;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 2011-12-11
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      相关资源
      最近更新 更多