powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как вытащить соседний столб в запросе с max(col) ?
24 сообщений из 24, страница 1 из 1
как вытащить соседний столб в запросе с max(col) ?
    #40074077
Код: sql
1.
2.
3.
SELECT id, max(status), col
FROM tbl
GROUP BY id



max(col) не подходит...
мне нужна col именно с той же самой строки, где лежит max(status), но при таком запросе она ругается
но если в GROUP BY пихнуть col, то будет уже 2+ строки, а мне нужна только max()
а если sum(col), то просуммирует ВСЕ строки с этим id
неужто только с подзапросом?
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40074078
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,

Код: sql
1.
2.
3.
4.
5.
6.
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
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40074081
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
а если sum(col), то просуммирует ВСЕ строки с этим id

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

Код: sql
1.
2.
3.
4.
5.
6.
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
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40074083
ну это не тот id, это parent entity id (peid)
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40074087
спасибо, всё чётко
так и знал, что надо оконки подключать
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40074235
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,

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

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

Код: sql
1.
2.
3.
SELECT DISTINCT ON (id) id, status, col
FROM tbl
ORDER BY id, status DESC;



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40074261
хм, хм... а говорят, что: "DISTINCT ON" on a large table always is performance killer.
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40074274
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
хм, хм... а говорят, что: "DISTINCT ON" on a large table always is performance killer.


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

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


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40074338
оно?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
    -- ВМЕСТО:
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$;
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40074391
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,

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

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40084462
а вот тут не работает такой вариант...
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT DISTINCT ON (cid) cid, added
FROM client_owner co

WHERE added >= '2020-07-15 00:00:00'

ORDER BY cid, added
LIMIT 25


на этот раз мне нужны строки с минимальным added, но PG вытаскивает любую строку без сортировки
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40084463
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
а вот тут не работает такой вариант...
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT DISTINCT ON (cid) cid, added
FROM client_owner co

WHERE added >= '2020-07-15 00:00:00'

ORDER BY cid, added
LIMIT 25


на этот раз мне нужны строки с минимальным added, но PG вытаскивает любую строку без сортировки


Странная идея... работает конечно.
Просто не так как вы почему то думаете но 100% логично.
Я подозреваю что вам надо запрос вида

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT cid, added FROM
(
SELECT DISTINCT ON (cid) cid, added
FROM client_owner co

WHERE added >= '2020-07-15 00:00:00'

ORDER BY cid, added
) AS _t
ORDER BY added LIMIT 25



PS: для такой задачи есть намного более эффективные решения через рекурсивный CTE впрочем.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40084464
ну вообще вот так сработало:
Код: sql
1.
2.
3.
4.
SELECT cid, min(added)
FROM client_owner co
GROUP BY cid
LIMIT 25


а эта задача не та что в сабже чтоли? Мне здесь тоже надо строки только с min(added)...
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40084465
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
ну вообще вот так сработало:
Код: sql
1.
2.
3.
4.
SELECT cid, min(added)
FROM client_owner co
GROUP BY cid
LIMIT 25


а эта задача не та что в сабже чтоли? Мне здесь тоже надо строки только с min(added)


Не таже... вам надо 25 с минимальным added а не все ctid с их минимальными added (и главное прочими полями из строки).
В вашем решении вообще никакой гарантии какие именно 25 строк вам вернуться.

Рекомендую таки еще раз подумать о корректной постановке задачи.
"на этот раз мне нужны строки с минимальным added" - однозначной постановкой не является...

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40084471
ну там такой расклад:
Код: sql
1.
2.
3.
cid int -- один cid может иметь неск.записей
uid int
added tstz(0)


и возвращает он мне именно строки, у которых минимальный added
по одной для каждого cid
всего 25 cid
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40084484
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
ну там такой расклад:
Код: sql
1.
2.
3.
cid int -- один cid может иметь неск.записей
uid int
added tstz(0)


и возвращает он мне именно строки, у которых минимальный added
по одной для каждого cid
всего 25 cid


1)У вас тут концептуальное непонимание чем отличается group by от distinct on
distinct on нужен когда вам не только cit + min(added) надо а ещё соответсвующие им uid - эта задача через group by не решается

2)таки вам надо любые 25 уникальных cid с их min(added) или какие то конкретные?
если любые то distinct on вам из выдаст
равно как и group by
если не любые то надо определить какие именно.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40084487
где у меня непонимание? п.1 как раз понятен
он мне НЕ выдаёт минимальный added, если делать через DISTINCT - вот что непонятно
он выдаёт любые added
мне надо все cid, у которых минимальный added и cc = 0 (там 1 или 0 на каждой строке)
cc - это 4я колонка, а uid тут не нужен
мой вариант тоже этого не даёт, там нужен ещё один запрос, но он хотя бы минимальный added вынимает
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40084491
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
где у меня непонимание? п.1 как раз понятен
он мне НЕ выдаёт минимальный added, если делать через DISTINCT - вот что непонятно
он выдаёт любые added
мне надо все cid, у которых минимальный added и cc = 0 (там 1 или 0 на каждой строке)
cc - это 4я колонка, а uid тут не нужен
мой вариант тоже этого не даёт, там нужен ещё один запрос, но он хотя бы минимальный added вынимает


не может distinct on выдавать не минимальный added если вы ничего не перепутали в запросе.
обычно путают в order by (который там естественно критичен для получения корректного результата)

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40084497
ну в ORDER BY впереди всегда должен стоять cid, который в DISTINCT ON
а следом за ним added, где ASC = min(added), а DESC = max(added)
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40084498
щас норм стало, я запрос переписал
где-то всё таки была ошибка
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40084499
только появился ещё нюанс - если добавить WHERE cc = 0, то когда cc = 1 при минимальном added, то он его отбросит и вытащит минимальным следующий...
который уже НЕ минимальный
как-то это можно обыграть в одном запросе?
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40084504
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
только появился ещё нюанс - если добавить WHERE cc = 0, то когда cc = 1 при минимальном added, то он его отбросит и вытащит минимальным следующий...
который уже НЕ минимальный
как-то это можно обыграть в одном запросе?



Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT cid, added FROM
(
SELECT DISTINCT ON (cid) cid, added, cc
FROM client_owner co
ORDER BY cid, added
) AS _t
WHERE cc=0



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40084505
ага, ну это очевидный вариант в 2 запроса )
спасибо
...
Рейтинг: 0 / 0
как вытащить соседний столб в запросе с max(col) ?
    #40084507
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
ага, ну это очевидный вариант в 2 запроса )
спасибо


Многие сложные аналитические запросы строятся по принципу матрёшки из вложенных запросов.
Это свойство SQL как языка работы с множествами а не процедурного.

А вот если надо будет этот запрос по реально большой таблице гонять да ещё и с ORDER BY added LIMIT 25 - там начнуться варианты как написать это всё быстро в процедурном стиле хотя и на sql.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как вытащить соседний столб в запросе с max(col) ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]