从每个组中选择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'记录优先于其余记录。

Demo here

另一答案

以下似乎对我有用:

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 行

SQL Server:根据多个条件从组中选择特定行

使用集成安全连接到 PostgreSQL 或回退到公共登录

Phonegap 状态栏样式默认或回退 android 低于 6

如何从每组中获得前 1 行? (T-SQL)

SELECT 查询从每个组中返回 1 行