可以說我有這樣的一個表:獲取頂級值
id | peru | usa
1 20 10
2 5 100
3 1 5
如何從peru
和usa
還有spefic IDS獲得最高值。所以,我得到的結果是:
usa_id: 2 | usa: 100 | peru_id: 1 | peru: 20
這可能在一個查詢?或者我必須做兩個ORDER BY
querys?
進出口使用PostgreSQL的
可以說我有這樣的一個表:獲取頂級值
id | peru | usa
1 20 10
2 5 100
3 1 5
如何從peru
和usa
還有spefic IDS獲得最高值。所以,我得到的結果是:
usa_id: 2 | usa: 100 | peru_id: 1 | peru: 20
這可能在一個查詢?或者我必須做兩個ORDER BY
querys?
進出口使用PostgreSQL的
你可以用一些子查詢和一個交叉聯接做到這一點:
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是唯一的)。
但它的速度不比兩個查詢快嗎? – 2015-04-01 22:24:19
由於這個查詢基本上包含了你所指的那兩個查詢,加上他們和別名他們的一些列,我希望這個查詢比單獨運行這兩個查詢花費的時間稍微多些,但差異應該可以忽略不計。 – bgoldst 2015-04-01 22:26:06
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掛斷了。
您可以考慮將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;
這是可能的一個查詢 – 2015-04-01 22:20:08
@Lashane請問你寫一個答案與查詢?謝謝! – 2015-04-01 22:21:01
對不起,但我們不是免費的代碼寫作社區 – 2015-04-01 22:21:52