sql - 如何在 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 或其他东西中,但如果可能的话,我非常有兴趣看到它在运行中!
解决方案
你很亲密。改用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;
推荐阅读
- visual-studio - 在 Visual Studio 中创建 Blazor 项目时“序列不包含元素”
- pine-script - TradingView 的 Pinescript - 为什么不允许递归?
- amazon-web-services - AWS Personalize — eventType 必须是关联数组
- elasticsearch - ElastAlert 将查询和范围组合成 OR 子句
- node.js - 如何注销并清除 Passport 和 Express-session 的会话?
- jenkins - Conan Artifactory Jenkins 集成失败
- pandas - 计算 Pandas 中距离最近日期的剩余天数
- github - 无法在 r markdown 中打开 githubu 文档中的代码跟踪
- c++ - 将对象移动到向量对字符串c ++的前面
- xslt - 如何删除重复条目 - XSLT