Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何为两个字段值选择相等数量的行?_Sql_Postgresql - Fatal编程技术网

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

Sql 如何为两个字段值选择相等数量的行?,sql,postgresql,Sql,Postgresql,鉴于下表: | animal | id | --------------- | Dog | 1 | | Cat | 2 | | Dog | 3 | | Dog | 4 | | Cat | 5 | | Dog | 6 | | Dog | 7 | | Dog | 8 | | Cat | 9 | | Dog | 10 | 在不使用并集的情况下,是否有任何方法可以选择行以返回相同数量的猫和狗,例如,分别选择3个: | ani

鉴于下表:

| animal | id |
---------------
| Dog    | 1  |
| Cat    | 2  |
| Dog    | 3  |
| Dog    | 4  |
| Cat    | 5  |
| Dog    | 6  |
| Dog    | 7  |
| Dog    | 8  |
| Cat    | 9  |
| Dog    | 10 |
在不使用并集的情况下,是否有任何方法可以选择行以返回相同数量的猫和狗,例如,分别选择3个:

| animal | id |
---------------
| Dog    | 1  |
| Cat    | 2  |
| Dog    | 3  |
| Dog    | 4  |
| Cat    | 5  |
| Cat    | 9  |
如果无法从可用行生成偶数的每只动物,则应尽可能接近偶数。

您可以使用按动物划分:

您可以使用“按动物分区”:


你在乎订单还是随机?是的,订单很重要你在乎订单还是随机?是的,订单很重要
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;