我正在使用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。
此外,如果有人知道,如果您将已排序的数据插入数据库,是否保证以相同的顺序回读?
答案 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)