Как группировать с отчетливым или групповым max sql - PullRequest
0 голосов
/ 02 октября 2019

У меня есть дата, подобная этой. Данные

id      name period difference 
6172    A      6      10 
6172    A      3      10 
10099   AB     12     24 
10099   AB     6      24 
10099   AB     3      24 
10052   ABC    12     26 
10052   ABC    6      26 
10052   ABC    3      26 
9014    ABCD   12     21 
9014    ABCD   6      21 
9014    ABCD   3      21

как получить такой результат

id      name    period  difference
6172    A         6      10
10099   AB        12     24
10052   ABC       12     26
9014    ABCD      12     4

Я пытаюсь с отличным (id), но результат, подобный этому

id     name    period   difference
6172    A         6      10
10099   AB        6      24
10052   ABC       6      26
9014    ABCD      6      4

Ответы [ 5 ]

2 голосов
/ 02 октября 2019

Требуемый запрос выглядит примерно так:

SELECT DISTINCT ON (id) *
FROM Data
ORDER BY id, period DESC;

enter image description here

Демо

Это, пожалуй, самый эффективный способ написать свой запрос на Postgres. Обратите внимание, что синтаксис DISTINCT ON не поддерживает более одного столбца в предложении ON. Приведенная выше логика работает здесь, предполагая, что id будет уникально идентифицировать каждую группу (то есть, что id всегда будет уникальным). Если нет, то нам, возможно, придется прибегнуть к использованию ROW_NUMBER с разделом над id и name.

0 голосов
/ 02 октября 2019

Вы можете попробовать мой код:

SELECT
  id, name, max(period), difference
FROM 
  data_table
group by id, name,difference
order by name

Это демонстрационная ссылка http://sqlfiddle.com/#!17/9ab8d/2

0 голосов
/ 02 октября 2019

Использование max()

select id, name, max(period), difference from tablename
group by id, name,difference 
0 голосов
/ 02 октября 2019

кажется, вам нужно просто max()

select id,name,max(period),max(difference)
from table group by id,name

Хотя я не нашел разницы = 4 в ваших выборочных данных, но вы использовали это на выходе, поэтому я догадался, что это ваша опечатка

0 голосов
/ 02 октября 2019

с использованием max()

select id, name, t2.period, difference from tableA t1
inner join 
 (select id, max(period) as period from tableA
 group by id) t2 on t2.id = t1.id

с использованием distinct()

select distinct id, name, t2.period, difference from tableA 
...