繁体   English   中英

SQL-根据另一列的内容查找最大值

[英]SQL - Find max based on contents of another column

必须有一种优雅的方法来执行此操作,但是我被卡住了。

我有一张包含化学数据的表格。 有些值“等于”,有些值“小于”报告的值,并在相邻的列中表示(用“ <”或“ =”表示)。 我在下面插入了一个示例。

我需要一个查询,即使存在与<<关联的更高的值,它也会返回与'='关联的每个元素的最大值(如果有的话)。 或者,如果最高值与“ =”相关联,或者如果所有值均为“ <”,则仅返回最高值。 在下面的示例中,我需要返回Copper = 10,Nickel = 10,而Lead = 9。

看起来很简单,但我无法解决。 与往常一样,任何帮助都将受到赞赏。

------------------------------
-- Table structure for `chem`
------------------------------
DROP TABLE IF EXISTS `chem`;
CREATE TABLE `chem` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`Element` varchar(12) DEFAULT NULL,
`Value` tinyint(4) DEFAULT NULL,
`Qualifier` varchar(2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of chem
-- ----------------------------
INSERT INTO `Chem` VALUES ('2', 'Copper', '1', '=');
INSERT INTO `Chem` VALUES ('3', 'Copper', '1', '=');
INSERT INTO `Chem` VALUES ('4', 'Copper', '3', '=');
INSERT INTO `Chem` VALUES ('5', 'Copper', '4', '=');
INSERT INTO `Chem` VALUES ('6', 'Copper', '5', '=');
INSERT INTO `Chem` VALUES ('7', 'Copper', '6', '=');
INSERT INTO `Chem` VALUES ('8', 'Copper', '7', '=');
INSERT INTO `Chem` VALUES ('9', 'Copper', '8', '=');
INSERT INTO `Chem` VALUES ('10', 'Copper', '9', '=');
INSERT INTO `Chem` VALUES ('11', 'Copper', '10', '=');
INSERT INTO `Chem` VALUES ('12', 'Nickel', '1', '<');
INSERT INTO `Chem` VALUES ('13', 'Nickel', '2', '<');
INSERT INTO `Chem` VALUES ('14', 'Nickel', '3', '=');
INSERT INTO `Chem` VALUES ('15', 'Nickel', '4', '<');
INSERT INTO `Chem` VALUES ('16', 'Nickel', '5', '=');
INSERT INTO `Chem` VALUES ('17', 'Nickel', '6', '=');
INSERT INTO `Chem` VALUES ('18', 'Nickel', '7', '=');
INSERT INTO `Chem` VALUES ('19', 'Nickel', '8', '=');
INSERT INTO `Chem` VALUES ('20', 'Nickel', '9', '=');
INSERT INTO `Chem` VALUES ('21', 'Nickel', '10', '=');
INSERT INTO `Chem` VALUES ('22', 'Lead', '1', '<');
INSERT INTO `Chem` VALUES ('23', 'Lead', '2', '<');
INSERT INTO `Chem` VALUES ('24', 'Lead', '3', '=');
INSERT INTO `Chem` VALUES ('25', 'Lead', '4', '=');
INSERT INTO `Chem` VALUES ('26', 'Lead', '5', '=');
INSERT INTO `Chem` VALUES ('27', 'Lead', '6', '<');
INSERT INTO `Chem` VALUES ('28', 'Lead', '7', '=');
INSERT INTO `Chem` VALUES ('29', 'Lead', '8', '=');
INSERT INTO `Chem` VALUES ('30', 'Lead', '9', '=');
INSERT INTO `Chem` VALUES ('31', 'Lead', '10', '<');

另一种解决方案是在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
 SELECT Element, MAX(Value) FROM Chem WHERE Qualifier = '=' GROUP BY Element
 UNION ALL
 SELECT Element, MAX(Value) FROM Chem C1 WHERE
   NOT EXISTS (SELECT * FROM Chem WHERE Element = C1.Element AND Qualifier = '=')
   GROUP BY Element

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM