sql - 如何为两个字段值选择相同数量的行?
问题描述
给定下表:
| animal | id |
---------------
| Dog | 1 |
| Cat | 2 |
| Dog | 3 |
| Dog | 4 |
| Cat | 5 |
| Dog | 6 |
| Dog | 7 |
| Dog | 8 |
| Cat | 9 |
| Dog | 10 |
在不使用 UNION 的情况下,是否有任何方法可以选择行以返回相等数量的猫和狗,例如每个选择 3 个:
| animal | id |
---------------
| Dog | 1 |
| Cat | 2 |
| Dog | 3 |
| Dog | 4 |
| Cat | 5 |
| Cat | 9 |
如果无法从可用行中生产出偶数的每只动物,则应尽可能接近偶数。
解决方案
您可以将row_number与 partition by 一起使用animal
:
CREATE TABLE sample(animal, id) AS
VALUES
('Dog', 1),
('Cat', 2),
('Dog', 3),
('Dog', 4),
('Cat', 5),
('Dog', 6),
('Dog', 7),
('Dog', 8),
('Cat', 9),
('Dog', 10);
WITH tmp AS (
SELECT
*,
row_number() OVER (PARTITION BY animal ORDER BY id) AS ordinal
FROM
sample
)
SELECT * FROM tmp WHERE ordinal <= 3;
推荐阅读
- python - 使用 sklearn 绘制 ROC 曲线
- regex - 正则表达式:匹配指定字符串后组合两个组
- python - 通过将每一行转换为熊猫数据框中的字典来创建新列
- python - 在python中从该数组中删除每隔一个元素
- spring - 在 pom.xml 中包含 jstl 依赖项时出错
- sql - presto sql 中的 cardinality() 是什么?
- python - 函数可以是函数定义的参数吗
- passwords - 如何在 Yocto 中添加 Sudouser
- python - python电子邮件多个接收者,错误的多个附件
- squid - 我无法通过 squid 代理访问 webmin