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;