如何在GROUP BY按Date分组时为MAX()函数添加条件获取指定Code最大值
按日期分组,针对不同Code取Value最大值的正确实现
你这个需求其实挺常见的,属于条件聚合的场景,思路方向是对的,但MAX()函数里直接写WHERE子句的语法不合法,咱们可以通过两种方式来实现:
通用写法:用CASE表达式实现条件聚合
这种写法几乎兼容所有SQL数据库(比如SQL Server、MySQL、Oracle等),是最稳妥的选择:
SELECT [Date], MAX(CASE WHEN [Code] = 'GOLD' THEN [Value] END) AS BestGold, MAX(CASE WHEN [Code] = 'SILVER' THEN [Value] END) AS BestSilver FROM [MyTable] GROUP BY [Date]
简单说下原理:当Code匹配目标值时,CASE会返回对应的Value,否则返回NULL;而MAX()函数会自动忽略NULL值,这样就得到了每个日期下对应Code的Value最大值。另外别忘了把[Date]放到SELECT列表里,不然分组后你没法知道每个最大值对应的是哪一天。
进阶写法:用FILTER子句(仅部分数据库支持)
如果你的数据库支持FILTER子句(比如PostgreSQL、BigQuery、Redshift等),写法会更直观易懂:
SELECT [Date], MAX([Value]) FILTER (WHERE [Code] = 'GOLD') AS BestGold, MAX([Value]) FILTER (WHERE [Code] = 'SILVER') AS BestSilver FROM [MyTable] GROUP BY [Date]
这个语法是专门为条件聚合设计的,可读性更强,但要注意不是所有数据库都支持(比如SQL Server、MySQL就没有这个语法)。
内容的提问来源于stack exchange,提问作者ManInMoon




