假设我有一张这样的表:
id | peru | usa
1 20 10
2 5 100
3 1 5
如何从peru
和usa
获取最高值以及特定ID。所以我得到了结果:
usa_id: 2 | usa: 100 | peru_id: 1 | peru: 20
这可能在一个查询中吗?或者我必须做两个ORDER BY
个查询?
我正在使用postgresql
答案 0 :(得分:1)
您可以使用一些子查询和交叉连接执行此操作:
select
u.id usa_id,
u.usa,
p.id peru_id,
p.peru
from
(select id, usa from mytable where usa=(select max(usa) from mytable) order by id limit 1) u
cross join (select id, peru from mytable where peru=(select max(peru) from mytable) order by id limit 1) p
;
如果有多个行具有相同的最大值(对于usa或peru,独立),此解决方案将选择id最低的行(我假设id是唯一的)。
答案 1 :(得分:1)
SELECT
t1.id as peru_id, t1.peru
, t2.id as usa_id, t2.usa
FROM tab1 t1, tab1 t2
ORDER BY t1.peru desc, t2.usa desc
limit 1
http://sqlfiddle.com/#!15/0c12f/6
基本上,这是一个简单的carthesian产品 - 我想大型数据集的性能会很差。
在小提琴上196ms for a 1k rows table。在10k行表 - sqlFiddle挂起。
答案 2 :(得分:1)
您可以考虑将MAX聚合函数与ARRAY类型结合使用。看看这个:
CREATE TEMPORARY TABLE _test(
id integer primary key,
peru integer not null,
usa integer not null
);
INSERT INTO _test(id, peru, usa)
VALUES
(1,20,10),
(2,5,100),
(3,1,5);
SELECT MAX(ARRAY[peru, id]) AS max_peru, MAX(array[usa, id]) AS max_usa FROM _test;
SELECT x.max_peru[1] AS peru, x.max_peru[2] AS peru_id, x.max_usa[1]
AS usa, x.max_usa[2] AS usa_id FROM (
SELECT MAX(array[peru, id]) AS max_peru,
MAX(array[usa, id]) AS max_usa FROM _test ) as x;