SQL速度问题
我正在使用PostgreSQL,希望使用如下查询: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
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;