Как получить идентификатор строки, которая была выбрана агрегированной функцией?

На этот вопрос уже есть ответ:

Всего 3 ответа


Существует не менее 3 способов: см. Ниже:

CREATE TEMP TABLE test (
    id integer, name text, amount numeric, datefrom timestamptz
);

COPY test FROM STDIN (FORMAT csv);
3,a,8,2018-01-01
4,a,3,2018-01-15 10:00
5,b,1,2018-02-20
6,b,1,2019-01-01
.

Метод 1. Использование DISTINCT ON (PostgreSQL-specific)

SELECT DISTINCT ON (name)
  id, name, amount
FROM test
ORDER BY name, amount DESC, datefrom ASC;

Способ 2. Использование оконных функций

SELECT id, name, amount FROM (
  SELECT *, row_number() OVER (
    PARTITION BY name
    ORDER BY amount DESC, datefrom ASC) AS __rn
  FROM test) AS x
WHERE x.__rn = 1;

Метод 3. с использованием перекрестного подзапроса

SELECT id, name, amount FROM test
WHERE id = (
  SELECT id FROM test AS t2
  WHERE t2.name = test.name
  ORDER BY amount DESC, datefrom ASC
  LIMIT 1
); 

demo: db <> скрипка

Вам нужно DISTINCT ON которое фильтрует первую строку для каждой группы.

SELECT DISTINCT ON (name) 
    * 
 FROM table 
 ORDER BY name, amount DESC

Вам нужно вложенное внутреннее соединение. Попробуй это -

SELECT id, T2.name, T2.amount
FROM TABLE T
INNER JOIN (SELECT name, MAX(amount) amount
            FROM TABLE
            GROUP BY name) T2
ON T.amount = T2.amount

Есть идеи?

10000