Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 как вытащить соседний столб в запросе с max(col) ?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 210
SELECT id, max(status), col
FROM tbl
GROUP BY id


max(col) не подходит...
мне нужна col именно с той же самой строки, где лежит max(status), но при таком запросе она ругается
но если в GROUP BY пихнуть col, то будет уже 2+ строки, а мне нужна только max()
а если sum(col), то просуммирует ВСЕ строки с этим id
неужто только с подзапросом?

Сообщение было отредактировано: 29 май 21, 19:24
29 май 21, 19:31    [22328842]     Ответить | Цитировать Сообщить модератору
 Re: как вытащить соседний столб в запросе с max(col) ?  [new]
court
Member

Откуда:
Сообщений: 2335
бабушкин зайчик,

with cte as (
  SELECT id, status, col,
    row_number()over(partition by col order by status desc) as rn
  FROM tbl
)
select * from cte where rn=1
29 май 21, 19:35    [22328843]     Ответить | Цитировать Сообщить модератору
 Re: как вытащить соседний столб в запросе с max(col) ?  [new]
court
Member

Откуда:
Сообщений: 2335
бабушкин зайчик
а если sum(col), то просуммирует ВСЕ строки с этим id

ээээ ... это надо понимать так, что поле id не уникальное ??
ахренедь !

with cte as (
  SELECT id, status, col,
    row_number()over(partition by id order by status desc) as rn
  FROM tbl
)
select * from cte where rn=1
29 май 21, 19:40    [22328848]     Ответить | Цитировать Сообщить модератору
 Re: как вытащить соседний столб в запросе с max(col) ?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 210
ну это не тот id, это parent entity id (peid)
29 май 21, 19:54    [22328852]     Ответить | Цитировать Сообщить модератору
 Re: как вытащить соседний столб в запросе с max(col) ?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 210
спасибо, всё чётко
так и знал, что надо оконки подключать
29 май 21, 20:11    [22328857]     Ответить | Цитировать Сообщить модератору
 Re: как вытащить соседний столб в запросе с max(col) ?  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4785
бабушкин зайчик,

Через window functions это конечно решается но это дико дорогое и тормозное решение на больших обьемах.
На практике это конечно же через DISTINCT ON конструкцию решается
https://www.postgresql.org/docs/13/sql-select.html#SQL-DISTINCT

В вашем случае это будет нечто вида

SELECT DISTINCT ON (id) id, status, col
FROM tbl
ORDER BY id, status DESC;


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
31 май 21, 05:50    [22329085]     Ответить | Цитировать Сообщить модератору
 Re: как вытащить соседний столб в запросе с max(col) ?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 210
хм, хм... а говорят, что: "DISTINCT ON" on a large table always is performance killer.
31 май 21, 09:05    [22329121]     Ответить | Цитировать Сообщить модератору
 Re: как вытащить соседний столб в запросе с max(col) ?  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4785
бабушкин зайчик
хм, хм... а говорят, что: "DISTINCT ON" on a large table always is performance killer.


только window functions еще больше performance killer... они для аналитики а не для online даже теоретически....

если количество уникальных id (в вашем случае) небольшое(1% и менее) относительно общего количества строк в таблице можно руками быструю версию distinct on сообразить которая будет на порядки быстрее при необходимости.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
31 май 21, 09:38    [22329137]     Ответить | Цитировать Сообщить модератору
 Re: как вытащить соседний столб в запросе с max(col) ?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 210
оно?
    -- ВМЕСТО:
SELECT DISTINCT ON (author_id) *
FROM b_p_t
ORDER BY author_id, ctime DESC

    -- НАДО:
CREATE OR REPLACE FUNCTION fast_distinct_on_test()
RETURNS SETOF b_p_t
LANGUAGE plpgsql AS $f$

DECLARE _b_p_t record;

BEGIN

--start from greatest author_id
SELECT * INTO _b_p_t FROM b_p_t ORDER BY author_id DESC, ctime DESC LIMIT 1;

LOOP

--finish if nothing found
EXIT WHEN _b_p_t IS NULL;

--return found value
RETURN NEXT _b_p_t;

--latest post from next author_id < current author_id
SELECT *

FROM b_p_t
INTO _b_p_t

WHERE author_id < _b_p_t.author_id.
ORDER BY author_id DESC, ctime DESC
LIMIT 1;

END LOOP;

END;
$f$;


Сообщение было отредактировано: 31 май 21, 12:25
31 май 21, 12:33    [22329255]     Ответить | Цитировать Сообщить модератору
 Re: как вытащить соседний столб в запросе с max(col) ?  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4785
бабушкин зайчик,

Следующий слайд где sql запрос без использования pl/pgsql на туже тему. ))
Важно понимать что это помогает если у вас на 100 сторок 1 уникальная...или хотя бы на 10 строк (и тут уже не факт как будет быстрее).
А когда у вас уникальных треть или половина там этот подход не поможет.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
31 май 21, 14:30    [22329352]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить