2015-04-01 85 views
0

可以说我有这样的一个表:获取顶级值

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

如何从peruusa还有spefic IDS获得最高值。所以,我得到的结果是:

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

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

进出口使用PostgreSQL的

+0

这是可能的一个查询 – 2015-04-01 22:20:08

+0

@Lashane请问你写一个答案与查询?谢谢! – 2015-04-01 22:21:01

+0

对不起,但我们不是免费的代码写作社区 – 2015-04-01 22:21:52

回答

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 
; 

在有与相同的最高值(美国或秘鲁多行的情况下,独立),这个解决方案将选择一个最低的ID(我认为这个ID是唯一的)。

+0

但它的速度不比两个查询快吗? – 2015-04-01 22:24:19

+0

由于这个查询基本上包含了你所指的那两个查询,加上他们和别名他们的一些列,我希望这个查询比单独运行这两个查询花费的时间稍微多些,但差异应该可以忽略不计。 – bgoldst 2015-04-01 22:26:06

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

由于basicly这样做是一个简单的carthesian产品 - 我想这表现将用于大型数据集是穷人。

在小提琴上它花了196ms for a 1k rows table。在10k行表上 - sqlFiddle挂断了。

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;