从每个组中选择1行匹配或回退

问题描述 投票:1回答:3

使用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
sql postgresql select
3个回答
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


1
投票

试试这个:

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'记录优先于其余记录。

Demo here


0
投票

以下似乎对我有用:

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

© www.soinside.com 2019 - 2024. All rights reserved.