2

これを行うにはエレガントな方法が必要ですが、私は立ち往生しています。

化学データを含むテーブルがあります。一部の値は報告された値と「等しい」、一部は「未満」であり、これは隣接する列に示されます (「<」または「=」を使用)。以下に例を挿入しました。

「=」に関連付けられた各要素の最大値を返すクエリが必要です。「<」に関連付けられたより高い値がある場合でも。または、最高値が「=」に関連付けられている場合、またはすべての値が「<」の場合は、最高値のみを返します。以下の例では、銅 = 10、ニッケル = 10、鉛 = 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', '<');
4

2 に答える 2

3

もう1つの解決策は、MAXステートメント内でCASEステートメントを使用することです。これは、SQLでSUMIF、COUNTIFなどのタイプのステートメントを実行する一般的な方法です。このトリックは、集約している値をフィルタリングしたい多くの状況に拡張されます。

このソリューションは、結合または結合を使用するソリューションとは異なり、データセットの1回のスキャンのみを必要とするため、非常に効率的です。

例えば:

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
于 2012-04-26T03:34:02.117 に答える
1
 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

これにより、2 つのクエリが実行され、結果が 1 つの結果セットにまとめられます。

最初のクエリは、「=」修飾子を持つ各要素の最大値を見つけます。2 番目のクエリは、"=" 修飾子がない他のケースを処理し、この要素のセットごとに最大値を返します。

于 2012-04-26T00:25:26.420 に答える