admin

每组产生n行

sql

已知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每个组中的行的查询,只需替换其中的一些常量即可。

我不受任何DBMS的约束,因此我对在任何DBMS上运行的任何解决方案都感兴趣。如果它使用一些非标准语法,那就很好。


阅读 184

收藏
2021-07-01

共1个答案

admin

对于支持分析功能\窗口功能的任何数据库,这都相对容易

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 typerank()函数。

根据您想要处理领带的方式,可能要使用dense_rank()row_number()而不是rank()。如果两行使用并列rank,则下一行将具有rnk3的值,而下一行将具有rnk2的值dense_rank。在这两种情况下,两个绑定行的arnk均为1。
row_number任意将两个绑定行a的a设为rnk1,将另一个arnk设为2。

2021-07-01