如何在COUNT/GROUP BY查询中添加分组内单条序列号示例列
修改SQL查询以添加分组示例序列号
原始数据
| Category | Serial Number |
|---|---|
| Sports | 3462 |
| Sports | 4373 |
| Sports | 3453 |
| Auto | 7742 |
| Auto | 1247 |
| Auto | 3463 |
| Auto | 1242 |
| Auto | 7746 |
期望查询结果
| Category | Serial Number Count | Example Serial Number |
|---|---|---|
| Sports | 3 | 3462 |
| Auto | 5 | 7742 |
注:原示例中Auto的计数应为5,与原始数据条目数一致
原查询语句
SELECT Category, COUNT( [Serial Number] ) AS [Serial Number Count] FROM abcDB GROUP BY Category
修改后的查询语句
通用方案(适用于多数数据库)
使用MIN/MAX这类通用聚合函数获取分组内任意一个序列号,所有关系型数据库基本都支持:
SELECT Category, COUNT( [Serial Number] ) AS [Serial Number Count], MIN( [Serial Number] ) AS [Example Serial Number] FROM abcDB GROUP BY Category
特定数据库优化方案
- MySQL:用
ANY_VALUE()函数更直观表达“取任意值”的意图:SELECT Category, COUNT( [Serial Number] ) AS [Serial Number Count], ANY_VALUE( [Serial Number] ) AS [Example Serial Number] FROM abcDB GROUP BY Category - SQL Server:若需指定取分组内第一条数据,可结合窗口函数:
WITH RankedData AS ( SELECT Category, [Serial Number], ROW_NUMBER() OVER (PARTITION BY Category ORDER BY (SELECT NULL)) AS rn FROM abcDB ) SELECT Category, COUNT( [Serial Number] ) OVER (PARTITION BY Category) AS [Serial Number Count], [Serial Number] AS [Example Serial Number] FROM RankedData WHERE rn = 1 GROUP BY Category, [Serial Number]
说明
MIN/MAX会返回分组内最小/最大的序列号,满足“任意一条”的要求;ANY_VALUE()是MySQL专属函数,无需指定排序,直接返回分组内任意数据;- 窗口函数方案适合需要精确控制取数规则的场景,仅需任意值时前两种方案更简洁。
内容的提问来源于stack exchange,提问作者AlbumBlast
相关产品推荐
相关产品推荐

