SQL速度问题

SQL速度问题,sql,postgresql,greatest-n-per-group,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 上面是我的表格,我知道id不是唯一的,不是我的设计,但它有一个目的,但在id中,让我们假设id=1,我想选择id、设备和最小值2,因此我的结果将是其他id的1、123、30

我正在使用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
上面是我的表格,我知道id不是唯一的,不是我的设计,但它有一个目的,但在id中,让我们假设id=1,我想选择id、设备和最小值2,因此我的结果将是其他id的1、123、30和1、456、40等等

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

请尝试以下查询:

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

这可以使用窗口功能完成:

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>创建表格\u表格id整数、设备整数、值整数; 创建表 postgres>插入到表格值中 ...> 1, 123, 40, ...> 1, 456, 30, ...> 1, 789, 45, ...> 2, 12 , 10, ...> 2, 11 , 9; 插入0.5 postgres>选择id、设备、值 来自 …>选择id、设备、值、, …>按id按值排序的分区上的行数为rn 从_表中 …>t
关于您的第一个问题:运行解释,尽管看起来您正在尝试加入。关于您的第二个问题:否始终指定顺序by如果您将已排序的数据插入到数据库中,是否可以保证以相同的顺序重新读取,这是一个明确的问题:否。除非您在查询中使用ORDER by,否则数据库可以自由选择其要返回行的任何顺序,这样可以避免相关子查询,特别是当id和value作为前导列的索引不可用时,按该顺序。如果我要查找每行具有最高两个值的行,我可能会使用一个窗口函数,如densite_rank。请看:您真的没有发现任何类似的问题吗?如果您希望以特定顺序返回结果,请添加一个ORDERBY子句。感谢所有人,我已经编辑了它,希望这更有意义。这非常有效,谢谢。我想我不太明白为什么?在值排序之后,是否可以在id上再添加一个排序?另外,感谢你没有表现得粗鲁,我从未声称自己擅长SQL,也不是一个伟大的作家。就像上面的snark…如果你同意,请接受这个答案。就排序而言,在拥有子句之后,您可以在ORDERBY子句中添加任意数量的列,但请确保该列也必须在group by column列表中。我非常感谢,一旦允许,我将接受作为正式答案。我猜是因为内部连接,它运行得更快?
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;