【问题标题】:SQL Syntax Help: Returning the maximum value of a counted combinationSQL 语法帮助:返回计数组合的最大值
【发布时间】:2019-11-13 04:52:49
【问题描述】:

假设我在表 1 中有以下数据:

ID  Color   Toy  
----------------------
1   Red     Car  
2   Red     Truck  
3   Red     Truck  
4   Blue    Car  
5   Blue    Car  
6   Yellow  Airplane

我想返回每种颜色最常见玩具的最大数量。我该怎么做?

我试过了

SELECT 
    aa.color, aa.toy, MAX(aa.totalcount) AS maxcount 
FROM 
    (SELECT Color, Toy, COUNT(*) AS totalcount 
     FROM Table 1 
     GROUP BY Color, Toy) aa;

由于某种原因,这似乎不起作用。我做错了什么?

这是我得到的错误:

在 SELECT 子句、HAVING 子句或 ORDER BY 子句中指定的以“Color”开头的表达式未在 GROUP BY 子句中指定,或者它位于具有列函数的 SELECT 子句、HAVING 子句或 ORDER BY 子句中并且没有指定 GROUP BY 子句.. SQLCODE=-119, SQLSTATE=42803, DRIVER=4.25.1301

我想要的期望输出是每种颜色的一行,其中最常见的玩具以及玩具/颜色组合的数量:

color   toy       count
-----------------------
Red     Truck     2     (NOT RED CAR)
Blue    Car       2
Yellow  Airplane  1

【问题讨论】:

  • 您使用的是哪个数据库?

标签: sql count max


【解决方案1】:

如果您使用的是 MSSQL,这个带有 GROUP BY 和 ROW_NUMBER() 的查询应该可以解决您的问题。您也可以对其他数据库使用相同的逻辑。

WITH CTE AS(
    SELECT Color,Toy,T Total, 
    ROW_NUMBER() OVER(PARTITION BY Color,Toy ORDER BY T DESC) RN
    FROM(
        SELECT color,toy,count(*) T
        FROM your_table
        GROUP BY color,toy
    ) A
)

SELECT * FROM CTE WHERE RN = 1

【讨论】:

  • 这实际上是标准 SQL,并不特定于 MSSQL
【解决方案2】:

SQL Server 提供了一种无需子查询的便捷方法:

SELECT TOP (1) WITH TIES Color, Toy, COUNT(*) AS totalcount 
FROM Table 1 
GROUP BY Color, Toy
ORDER BY ROW_NUMBER() OVER (PARTITION BY Color ORDER BY COUNT(*) DESC);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 2011-07-28
    • 2020-09-24
    • 2014-12-30
    • 2022-01-05
    • 2011-07-28
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多