Mysql SQL-基于另一列的内容查找最大值

Mysql SQL-基于另一列的内容查找最大值,mysql,sql,function,aggregate,Mysql,Sql,Function,Aggregate,必须有一个优雅的方式来做到这一点,但我被卡住了 我有一张化学数据表。有些值“等于”报告值,有些值“小于”报告值,这在相邻列中表示(带' 这将执行两个查询并将结果组合到单个结果集中 第一个查询查找具有“=”限定符的每个元素的最大值。第二个查询处理没有“=”限定符的另一种情况,并返回这组元素的最大值 这将执行两个查询并将结果组合到单个结果集中 第一个查询查找具有“=”限定符的每个元素的最大值。第二个查询处理没有“=”的另一种情况限定符,并返回这组元素的最大值。另一种解决方案是在MAX语句中使用CAS

必须有一个优雅的方式来做到这一点,但我被卡住了

我有一张化学数据表。有些值“等于”报告值,有些值“小于”报告值,这在相邻列中表示(带' 这将执行两个查询并将结果组合到单个结果集中

第一个查询查找具有“=”限定符的每个元素的最大值。第二个查询处理没有“=”限定符的另一种情况,并返回这组元素的最大值

这将执行两个查询并将结果组合到单个结果集中


第一个查询查找具有“=”限定符的每个元素的最大值。第二个查询处理没有“=”的另一种情况限定符,并返回这组元素的最大值。

另一种解决方案是在MAX语句中使用CASE语句。这是在SQL中执行SUMIF、COUNTIF等类型语句的常用方法。此技巧将扩展到许多情况,在这些情况下,您需要筛选正在聚合的值

此解决方案非常有效,因为它只需要对数据集进行一次扫描,而不是使用连接或联合的解决方案

例如:

SELECT Element
       ,COALESCE(MAX(CASE WHEN Qualifier = '=' THEN Value ELSE NULL END), MAX(CASE WHEN Qualifier = '<' THEN Value ELSE NULL END))
FROM chem
GROUP BY Element
选择元素

,COALESCE(MAX(CASE-WHEN-Qualifier='='然后Value-ELSE-NULL-END),MAX(CASE-WHEN-Qualifier='另一种解决方案是在MAX语句中使用CASE语句。这是在SQL中执行SUMIF、COUNTIF等类型语句的常用方法。此技巧将扩展到许多情况,其中您希望筛选正在聚合的值

此解决方案非常有效,因为它只需要对数据集进行一次扫描,而不是使用连接或联合的解决方案

例如:

SELECT Element
       ,COALESCE(MAX(CASE WHEN Qualifier = '=' THEN Value ELSE NULL END), MAX(CASE WHEN Qualifier = '<' THEN Value ELSE NULL END))
FROM chem
GROUP BY Element
选择元素

,COALESCE(MAX(CASE-WHEN-Qualifier='='然后Value-ELSE-NULL-END),MAX(CASE-WHEN-Qualifier='我认为这在同一个元素中有带'='和非''='限定符的记录的情况下不起作用。在这种情况下,我希望有两行。为什么会这样?第一个查询只包含带'='的元素限定符,第二个查询只包括不带“=”限定符的元素。查看示例数据,第二个查询不会向结果集中添加任何记录。第二个查询会处理缺少的测试用例,其中所有记录都具有“NOT EXISTS可能会非常慢,尤其是对于子查询。我相信左连接会快得多。更快是好的(像这样的相关NOT EXISTS会非常慢),但前提是得到正确的结果。我不知道如何仅使用联接来解决此问题。@Larry Lustig-因为GROUP BY应用于UNION ALL之前的每个查询。如果您同时具有qualifier='='和qualifier'='行,您将得到两个GROUP BY结果,并将它们输入UNION ALL,从而为给定元素生成两个结果。我的逻辑中存在缺陷here?我认为在同一个元素中有带“=”和非“=”限定符的记录的情况下,这不起作用。在这种情况下,我希望有两行。为什么会这样?第一个查询只包括带“=”限定符的元素,第二个查询只包括不带“=”的元素限定符。查看示例数据,第二个查询不会向结果集中添加任何记录。第二个查询会处理缺少的测试用例,其中所有记录都“不存在”,这可能会非常慢,尤其是在子查询中。我相信左连接会快得多。速度越快越好(这样一个不存在的关联将非常缓慢),但前提是得到正确的结果。我不知道如何仅使用联接来解决此问题。@Larry Lustig-因为GROUP BY应用于UNION ALL之前的每个查询。如果您同时具有qualifier='='和qualifier'='行,您将得到两个GROUP BY结果,并将它们输入UNION ALL,从而为给定元素生成两个结果。我的逻辑中存在缺陷here?您的测试数据缺少一个案例-一个包含所有“您的测试数据缺少一个案例”的元素-一个包含所有“+1”的元素:将此更改为
COALESCE(MAX(),MAX())
,您就可以得到OP想要的结果。此外,此操作只需对数据进行一次扫描即可完成(此处的其他操作需要两次扫描),没有连接、联合等。是的,添加了COALESCE,这是最好的解决方案。太棒了。稍微调整一下,它就像一个符咒。感谢你教我一个新的、有用的函数。+1:将此更改为
COALESCE(MAX(),MAX())
,你就可以得到OP想要的。另外,这只需扫描一次数据就可以了(这里的其他需要两次扫描),并且没有连接、联合等。是的,添加了COALESCE,这是最好的解决方案。太棒了。稍微调整一下,效果非常好。谢谢你教我一个新的、有用的函数。
SELECT Element
       ,COALESCE(MAX(CASE WHEN Qualifier = '=' THEN Value ELSE NULL END), MAX(CASE WHEN Qualifier = '<' THEN Value ELSE NULL END))
FROM chem
GROUP BY Element