首页 > 解决方案 > 如何在 SQL 中选择每个类别的前 n 条记录而没有任何重复?

问题描述

我正在尝试按类别在数据库中选择一组食谱。标准是每个类别我需要n个没有重复的食谱。所以,给定一个数据集recipes

id | category
---|---------
1  | dairy
1  | eggs
1  | vegetarian
2  | dairy
2  | dessert
3  | thanksgiving
...  

是否可以以我的结果数据集看起来像这样的方式执行选择,在哪里n=1

id  | category
----|----------
1   | dairy
2   | dessert
3   | thanksgiving

我正好使用 Presto 来查询这个数据集,总共大约有 30 个类别。我最初认为也许我可以做一些嵌套UNION语句,但是a)对于我拥有的类别数量来说这将是乏味的,并且b)我认为它不会起作用,因为每个UNION都是它自己的东西并且不知道过去。我也考虑过使用

select id from (
  select id, category, row_number() over (partition by category order by id)
  from recipes)
where row_num < 2

这将允许我设置要从每个类别返回多少个 id,但不处理删除重复项。

最终我有一种感觉,这在 SQL 中是不可能的,我应该将它移到 Python 或其他东西中,但如果可能的话,我非常有兴趣看到它在运行中!

标签: sqlpresto

解决方案


你很亲密。改用partition by id

select id, category
from (select id, category,
             row_number() over (partition by id order by id) as seqnum
      from recipes
     )
where seqnum = 1;

order by如果你想确定你想要哪一行,唯一的区别是——例如按字母顺序排列的第一个类别。

注意:如果你想要一个 id per category,那么我可能会建议聚合:

select category, min(id)
from t
group by category;

推荐阅读