可以说我有这样的一个表:获取顶级值
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