众所周知,GROUP BY每组产生一行。我想为每组生成多行。例如,特定用例是为每个项目选择两个最便宜的产品。
GROUP BY
对于组中的两个或三个元素来说是微不足道的:
select type, variety, price from fruits where price = (select min(price) from fruits as f where f.type = fruits.type) or price = (select min(price) from fruits as f where f.type = fruits.type and price > (select min(price) from fruits as f2 where f2.type = fruits.type));
但我正在寻找一个可以显示n每组行的查询,其中n任意大。换句话说,一个5按组显示行的查询应该可以转换为一个7按组显示行的查询,只需替换其中的一些常量即可。
n
5
7
我不受任何 DBMS 的限制,因此我对在任何 DBMS 上运行的任何解决方案感兴趣。如果它使用一些非标准语法,那很好。
对于任何支持解析函数\窗口函数的数据库,这相对容易
select * from (select type, variety, price, rank() over ([partition by something] order by price) rnk from fruits) rank_subquery where rnk <= 3
如果省略[partition by something],您将获得前三行。如果你想要每个 的前三名type,你会partition by type在你的rank()函数中。
[partition by something]
type
partition by type
rank()
根据您想要如何处理关系,您可能想要使用dense_rank()或row_number()而不是rank()。如果两行并列,使用rank,则下一行的 arnk为 3,而使用 时的 arnk为 2 dense_rank。在这两种情况下,两个并列行的 arnk为 1。 row_number将任意赋予两个并列行中的一个 arnk为 1,另一个 arnk为 2。
dense_rank()
row_number()
rank
rnk
dense_rank
row_number