Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как вытащить соседний столб в запросе с max(col) ? / 24 сообщений из 24, страница 1 из 1
29.05.2021, 19:31
    #40074077
как вытащить соседний столб в запросе с max(col) ?
Код: 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
29.05.2021, 19:35
    #40074078
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как вытащить соседний столб в запросе с max(col) ?
бабушкин зайчик,

Код: 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
29.05.2021, 19:40
    #40074081
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как вытащить соседний столб в запросе с max(col) ?
бабушкин зайчик
а если 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
29.05.2021, 19:54
    #40074083
как вытащить соседний столб в запросе с max(col) ?
ну это не тот id, это parent entity id (peid)
...
Рейтинг: 0 / 0
29.05.2021, 20:11
    #40074087
как вытащить соседний столб в запросе с max(col) ?
спасибо, всё чётко
так и знал, что надо оконки подключать
...
Рейтинг: 0 / 0
31.05.2021, 05:50
    #40074235
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как вытащить соседний столб в запросе с max(col) ?
бабушкин зайчик,

Через 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
31.05.2021, 09:05
    #40074261
как вытащить соседний столб в запросе с max(col) ?
хм, хм... а говорят, что: "DISTINCT ON" on a large table always is performance killer.
...
Рейтинг: 0 / 0
31.05.2021, 09:38
    #40074274
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как вытащить соседний столб в запросе с max(col) ?
бабушкин зайчик
хм, хм... а говорят, что: "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
31.05.2021, 12:33
    #40074338
как вытащить соседний столб в запросе с max(col) ?
оно?
Код: 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
31.05.2021, 14:30
    #40074391
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как вытащить соседний столб в запросе с max(col) ?
бабушкин зайчик,

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

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
17.07.2021, 17:05
    #40084462
как вытащить соседний столб в запросе с max(col) ?
а вот тут не работает такой вариант...
Код: 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
17.07.2021, 17:15
    #40084463
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как вытащить соседний столб в запросе с max(col) ?
бабушкин зайчик
а вот тут не работает такой вариант...
Код: 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
17.07.2021, 17:23
    #40084464
как вытащить соседний столб в запросе с max(col) ?
ну вообще вот так сработало:
Код: sql
1.
2.
3.
4.
SELECT cid, min(added)
FROM client_owner co
GROUP BY cid
LIMIT 25


а эта задача не та что в сабже чтоли? Мне здесь тоже надо строки только с min(added)...
...
Рейтинг: 0 / 0
17.07.2021, 17:28
    #40084465
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как вытащить соседний столб в запросе с max(col) ?
бабушкин зайчик
ну вообще вот так сработало:
Код: 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
17.07.2021, 19:18
    #40084471
как вытащить соседний столб в запросе с max(col) ?
ну там такой расклад:
Код: sql
1.
2.
3.
cid int -- один cid может иметь неск.записей
uid int
added tstz(0)


и возвращает он мне именно строки, у которых минимальный added
по одной для каждого cid
всего 25 cid
...
Рейтинг: 0 / 0
17.07.2021, 22:08
    #40084484
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как вытащить соседний столб в запросе с max(col) ?
бабушкин зайчик
ну там такой расклад:
Код: 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
17.07.2021, 23:17
    #40084487
как вытащить соседний столб в запросе с max(col) ?
где у меня непонимание? п.1 как раз понятен
он мне НЕ выдаёт минимальный added, если делать через DISTINCT - вот что непонятно
он выдаёт любые added
мне надо все cid, у которых минимальный added и cc = 0 (там 1 или 0 на каждой строке)
cc - это 4я колонка, а uid тут не нужен
мой вариант тоже этого не даёт, там нужен ещё один запрос, но он хотя бы минимальный added вынимает
...
Рейтинг: 0 / 0
18.07.2021, 00:03
    #40084491
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как вытащить соседний столб в запросе с max(col) ?
бабушкин зайчик
где у меня непонимание? п.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
18.07.2021, 02:29
    #40084497
как вытащить соседний столб в запросе с max(col) ?
ну в ORDER BY впереди всегда должен стоять cid, который в DISTINCT ON
а следом за ним added, где ASC = min(added), а DESC = max(added)
...
Рейтинг: 0 / 0
18.07.2021, 02:40
    #40084498
как вытащить соседний столб в запросе с max(col) ?
щас норм стало, я запрос переписал
где-то всё таки была ошибка
...
Рейтинг: 0 / 0
18.07.2021, 02:47
    #40084499
как вытащить соседний столб в запросе с max(col) ?
только появился ещё нюанс - если добавить WHERE cc = 0, то когда cc = 1 при минимальном added, то он его отбросит и вытащит минимальным следующий...
который уже НЕ минимальный
как-то это можно обыграть в одном запросе?
...
Рейтинг: 0 / 0
18.07.2021, 10:36
    #40084504
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как вытащить соседний столб в запросе с max(col) ?
бабушкин зайчик
только появился ещё нюанс - если добавить 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
18.07.2021, 10:55
    #40084505
как вытащить соседний столб в запросе с max(col) ?
ага, ну это очевидный вариант в 2 запроса )
спасибо
...
Рейтинг: 0 / 0
18.07.2021, 11:13
    #40084507
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как вытащить соседний столб в запросе с max(col) ?
бабушкин зайчик
ага, ну это очевидный вариант в 2 запроса )
спасибо


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

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

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


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