如何在SQL中获得MAX(COUNT)?

时间:2018-10-11 15:50:54

标签: sql sql-server

我想获取在数据集中具有MAX计数的实体的名称,也想获取相同的计数。

SELECT 
    STORE_TYPE AS 'FREQUENT CHANNEL', 
    COUNT(STORE_TYPE) AS 'TOTAL TRANSACTIONS'
FROM 
    TRANSACTION_INFO
GROUP BY 
    STORE_TYPE

这将返回STORE_TYPETOTAL_TRANSACTIONS的计数。

现在,我想获取 STORE_TYPE和表现最佳(最大)的TOTAL TRANSACTIONS

谢谢!

3 个答案:

答案 0 :(得分:5)

如果要一行,则逻辑为group by以计算计数。然后order by以及将结果限制在顶部的某种方式:

SELECT STORE_TYPE, COUNT(*) AS cnt
FROM TRANSACTION_INFO
GROUP BY STORE_TYPE
ORDER BY cnt DESC
FETCH FIRST 1 ROW ONLY;

在出现平局的情况下,这只会返回一个具有最高值的任意行。处理关系的最佳方法取决于数据库。

FETCH FIRST 1 ROW ONLY是用于将结果集限制为一行的ISO / ANSI标准。您的数据库可能为此使用其他语法。

我也强烈建议您不要对列别名使用单引号。使用不需要转义的名称-这是最好的建议。否则,请对数据库使用转义机制,通常使用双引号,反引号或方括号。

编辑:

SQL Server中包含关系的解决方案是:

SELECT TOP (1) STORE_TYPE, COUNT(*) AS cnt
FROM TRANSACTION_INFO
GROUP BY STORE_TYPE
ORDER BY cnt DESC;

如果只需要一行,请删除WITH TIES

答案 1 :(得分:2)

您可以简单地按最大值排序,然后限制为一行。

SELECT 
STORE_TYPE AS 'FREQUENT CHANNEL', 
COUNT(STORE_TYPE) AS 'TOTAL TRANSACTIONS'
FROM TRANSACTION_INFO
GROUP BY STORE_TYPE
ORDER BY 'TOTAL TRANSACTIONS' DESC
LIMIT 1

LIMIT的方式取决于SQL方言。

答案 2 :(得分:1)

只要有一个store_type做得最好,其他答案就可以很好地工作。如果您还想考虑多个并列第一的位置,则应使用:

with s (t, c) as (
  select store_type, count(*)
    from transaction_info group by store_type
)
select
    t as 'FREQUENT CHANNEL',
    c as 'TOTAL TRANSACTIONS'
  from s
  where c = (select max(c) from s)

此查询将向您显示一个或多个行。

相关问题