从每个组中选择1行匹配或回退
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从每个组中选择1行匹配或回退相关的知识,希望对你有一定的参考价值。
使用PostgreSQL 9.6,如何从这样的数据中获取:
group | foo | value
------+-----+------
1 | A | a
1 | B | b
1 | C | c
2 | B | b2
2 | A | a2
3 | B | b3
3 | C | c3
每个group
一行,以便:
- 如果有
foo = A
排,拿它, - 否则从该组中取任何一行?
示例输出:
group | foo | value
------+-----+------
1 | A | a
2 | A | a2
3 | B | b3 <- chosen one row from group 3
答案
t=# select distinct on ("group") "group", foo, value
from table
order by "group", foo = 'A' DESC;
group | foo | value
--------+-------+-------
1 | A | a
2 | B | b2
3 | B | b3
(3 rows)
我认为neatest将是DISTINCT ON
另一答案
试试这个:
SELECT "group", "foo", "value"
FROM (
SELECT "group", "foo", "value",
ROW_NUMBER() OVER (PARTITION BY "group"
ORDER BY CASE
WHEN "foo" = 'A' THEN 1
ELSE 2
END, "foo") AS seq
FROM Table1) AS t
WHERE t.seq = 1
该查询使用带有条件ROW_NUMBER
子句的ORDER BY
,以便将'A'
记录优先于其余记录。
另一答案
以下似乎对我有用:
SELECT DISTINCT
group,
first_value(foo) OVER (PARTITION BY group ORDER BY foo = 'A' DESC) 'foo',
first_value(value) OVER (PARTITION BY group ORDER BY foo = 'A' DESC) 'value'
FROM ...
如果我需要指定选择回退行的标准,我可以通过扩展ORDER BY
子句来完成,例如。 ORDER BY foo = 'A' DESC, foo ASC
。
以上是关于从每个组中选择1行匹配或回退的主要内容,如果未能解决你的问题,请参考以下文章
在 ms Access 中从每个组中选择至少 3 行时出错 - 仅选择了至少 2 行