Из каждой группы выберите 1 строку, которая соответствует или является резервной - PullRequest
0 голосов
/ 24 мая 2018

Используя 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

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Попробуйте это:

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' записей над остальными записями.

Демо здесь

0 голосов
/ 24 мая 2018
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

0 голосов
/ 24 мая 2018

Мне кажется, что работает следующее:

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.

...