从两列中获取最高值

时间:2015-04-01 22:14:40

标签: sql postgresql

假设我有一张这样的表:

id  |  peru  | usa
 1      20      10
 2       5      100
 3       1       5

如何从peruusa获取最高值以及特定ID。所以我得到了结果:

usa_id: 2 | usa: 100 |  peru_id: 1 | peru: 20

这可能在一个查询中吗?或者我必须做两个ORDER BY个查询?

我正在使用postgresql

3 个答案:

答案 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;