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));

但我正在寻找一个可以显示n每组行的查询,其中n任意大。换句话说,一个5按组显示行的查询应该可以转换为一个7按组显示行的查询,只需替换其中的一些常量即可。

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


阅读 247

收藏
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 type在你的rank()函数中。

根据您想要如何处理关系,您可能想要使用dense_rank()row_number()而不是rank()。如果两行并列,使用rank,则下一行的 arnk为 3,而使用 时的 arnk为 2 dense_rank。在这两种情况下,两个并列行的 arnk为 1。 row_number将任意赋予两个并列行中的一个 arnk为 1,另一个 arnk为 2。

2021-07-01