2015-04-01 61 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;