已知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));
(在mysql中每组选择n行)
但是我正在寻找一个查询,该查询可以显示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,则下一行将具有rnk3的值,而下一行将具有rnk2的值dense_rank。在这两种情况下,两个绑定行的arnk均为1。 row_number任意将两个绑定行a的a设为rnk1,将另一个arnk设为2。
dense_rank()
row_number()
rank
rnk
dense_rank
row_number