SQL速度问题

时间:2016-10-27 14:26:08

标签: sql postgresql greatest-n-per-group

我正在使用PostgreSQL并希望使用这样的查询:

SELECT  device, value, id 
FROM  myTable s 
WHERE (SELECT  COUNT(*) FROM myTable f WHERE f.id = s.id AND f.value >= s.value ) <= 2

这样可行,但问题是执行大数据需要几分钟。是否有更快的方式可以在几秒钟内发生?我想要做的是从一行中只取两个项目,其中两个值按asc顺序排序。

id | device | value

1     123       40
1     456       30
1     789       45
2     12        10
2     11        9

以上是我的表(我知道ID不是唯一的,不是我的设计,但它有一个目的)但是在id里面说id = 1,我想选择id,device和最小的2的值,所以我的结果将是1,123,30和1,456,40等其他ID。

此外,如果有人知道,如果您将已排序的数据插入数据库,是否保证以相同的顺序回读?

2 个答案:

答案 0 :(得分:2)

尝试以下查询:

SELECT s.device,s.id,s.value
FROM myTable s
INNER JOIN myTable f ON s.id = f. id AND f.value >= s.value
GROUP BY s.device,s.id,s.value
HAVING COUNT(s.id) <= 2

答案 1 :(得分:-1)

这可以使用窗口函数来完成:

select id, device, value
from (
  select id, device, value, 
         row_number() over (partition by id order by value) as rn
  from the_table
) t
where rn <= 2
order by id, device, value;

示例:

postgres> create table the_table (id integer, device integer, value integer);
CREATE TABLE
postgres> insert into the_table values
...> (1, 123, 40),
...> (1, 456, 30),
...> (1, 789, 45),
...> (2, 12 , 10),
...> (2, 11 , 9);
INSERT 0 5

postgres> select id, device, value
...> from (
...>   select id, device, value,
...>          row_number() over (partition by id order by value) as rn
...>   from the_table
...> ) t
...> where rn <= 2;

 id | device | value
----+--------+-------
  1 |    123 |    40
  1 |    456 |    30
  2 |     11 |     9
  2 |     12 |    10
(4 rows)