考虑这个小桌子
Insert into Temp (key1, key2, value1, value2) VALUES
(10, 100, 20, 200),
(11, 101, 19, 199),
(12, 102, 21, 202);
如果我跑
SELECT MAX(key1), MIN(key2) FROM Temp;
我得到了
12, 100
正如所料。
我还想返回与这些键相关的值,比如
SELECT MAX(key1), value1-which-has-that-max-key, MIN(key2), value2-which-has-that-min-key FROM Temp;
在此示例中应该返回
12, 21, 100, 200
我该怎么做?感谢
答案 0 :(得分:3)
您可以使用子选择:
SELECT
MAX(T1.key1) AS maxkey1,
(SELECT value1 FROM Temp AS T2 WHERE T2.key1 = MAX(T1.key1)) AS value1,
MIN(T1.key2) AS minkey2,
(SELECT value2 FROM Temp AS T3 WHERE T3.key2 = MIN(T1.key2)) AS value2
FROM Temp T1
查看在线工作:sqlfiddle
请注意,如果您有多个具有相同最小值/最大值的键,则会失败。如果您可能遇到这种情况,可能需要添加ORDER BY ... LIMIT 1
,因此请选择其中一行而不是出错。
答案 1 :(得分:1)
或者,您可以使用两个派生表,每个派生表都将返回有序行集中的最顶行。可以按key1
的降序对其行集进行排序,然后按key2
的升序对其进行排序。这就是我的意思:
SELECT
max.key1,
max.value1,
min.key2,
min.value2
FROM
(SELECT key1, value1 FROM Temp ORDER BY key1 DESC LIMIT 1) max,
(SELECT key2, value2 FROM Temp ORDER BY key2 ASC LIMIT 1) min
;
可以找到“实时”演示at SQL Fiddle。
如果可以(并且实际上)有多个行具有相同的最大值key1
或相同的最小值key2
,则此查询将起作用,但是,类似于Mark Byers谈到他的解决方案时,我会建议在ORDER BYs中添加额外的标准,以使结果(更多)可预测。