sql - 如何为两个字段值选择相等数量的行?

标签 sql postgresql

给出下表:

| 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动物划分:

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;

关于sql - 如何为两个字段值选择相等数量的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52821223/

相关文章:

php - 如何将自定义查询转换为 CDbCriteria

json - 获取 JSONB 属性的计数

python - 使用缓冲区通过pandas写入psycopg3复制结果

postgresql - 真空分析模式 postgres 中的所有表

sql - 将图像字节写入数据库是否错误?

sql - 如何将所有数据库用户从一个数据库复制到另一个数据库

php - pg_escape_string 究竟做了什么?

javascript - 与 Sequelize 的一对一关系

sql - 如何停止对特定查询使用数据库索引?

mysql - 如何确定查询已处理的数据库表行?