powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с запросом
26 сообщений из 26, показаны все 2 страниц
Помогите с запросом
    #39720826
westvovik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица к примеру след вида:

id, packs_id, status_id, total_rub

1 100 1 1000
1 101 2 2000
2 102 1 500
3 103 3 600
...


Хочу отсортировать по столбцу total_rub, но отобрать только уникальные ID, мне вообще кроме вывода уникального id более ничего не нужно. Как можно это сделать более эффективнее?

p.s. версия postgresql 10
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720853
westvovik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, забыл добавить к запросу LIMIT на вывод записей
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720892
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
westvovikЕсть таблица к примеру след вида:

id, packs_id, status_id, total_rub

1 100 1 1000
1 101 2 2000
2 102 1 500
3 103 3 600
...


Хочу отсортировать по столбцу total_rub, но отобрать только уникальные ID...
И как из вашего примера можно понять, из какой конкретно строки уникальный ID брать? В случае, если у одного ID total_rub разные , но влияют на место в отсортированном наборе?
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720900
westvovik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MegabytewestvovikЕсть таблица к примеру след вида:

id, packs_id, status_id, total_rub

1 100 1 1000
1 101 2 2000
2 102 1 500
3 103 3 600
...


Хочу отсортировать по столбцу total_rub, но отобрать только уникальные ID...
И как из вашего примера можно понять, из какой конкретно строки уникальный ID брать? В случае, если у одного ID total_rub разные , но влияют на место в отсортированном наборе?

Так вот в этом то и дело, поэтому и спрашиваю, как можно это сделать?

Я хочу:
1. Отсортировать таблицу по нужному столбцу или столбцам
2. Отобрать верхние уникальные id по заданному лимиту
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720913
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
westvovik,

Код: sql
1.
2.
3.
select id from (select id, max(total_rub) as trub from tbl group by id) a
order by trub desc
limit 100500

?
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720916
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
westvovik,

Distinct ON
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720919
westvovik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Аннаwestvovik,

Distinct ON

Еслиб так все было просто)
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720920
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
westvovik,

Код: sql
1.
2.
3.
4.
select distinct id, max(total_rub) over (partition by id) as trub
from tbl
order by trub desc
limit 100500
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720923
westvovik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Воронцовwestvovik,

Код: sql
1.
2.
3.
select id from (select id, max(total_rub) as trub from tbl group by id) a
order by trub desc
limit 100500

?

мах - очень будет медленно на больших таблицах
плюс если будет необходимо по трем столбцам сделать такую сортировку с выборкой,
я думаю загнется все, я вот в сторону WITH думаю
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720926
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
westvovik,

И что ты про with думаешь?
Почему будет медленно? При каких условиях?
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720954
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
westvovikЩукина Аннаwestvovik,

Distinct ON

Еслиб так все было просто)в исходный условиях, поставленным в посте 1 и 2 - именно так всё просто...

https://postgrespro.ru/docs/postgrespro/9.5/sql-select SELECT DISTINCT ON ( выражение [, ...] ) сохраняет только первую строку из каждого набора строк, для которого данное выражение даёт одинаковые значения. Выражения DISTINCT ON обрабатываются по тем же правилам, что и выражения ORDER BY (см. выше). Заметьте, что «первая строка» каждого набора непредсказуема, если только не применяется предложение ORDER BY, определяющее, какие строки должны быть первыми.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720956
westvovik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Воронцовwestvovik,

И что ты про with думаешь?
Почему будет медленно? При каких условиях?

Да по практике использования мах очень тормозит вывод,
щас вот попробовал в реальности запрос, так он 0,4 сек

SELECT DISTINCT id, max(to_total_rub) over (partition by id) as trub
FROM orders_t o ORDER BY trub DESC LIMIT 25

Таблица эта вьюшка, там еще джоинов штук 10, записей порядка 100 000
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720957
westvovik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,

Ну и будут не уникальные ID в таком запросе, думаете это не попробовал
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720964
westvovik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По сути мне после сортировки нужно получить от каждой группы строк
по одной строчке и выбрать эти id от туда
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720966
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
westvovikЩукина Анна,

Ну и будут не уникальные ID в таком запросе, думаете это не попробовал "ON" специально было выделено и подчеркнуто. Но если оно вам не подходит - то тут дело не в инструменте, а в неумении им пользоваться...
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720971
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
westvovikПо сути мне после сортировки нужно получить от каждой группы строк
по одной строчке и выбрать эти id от туда
оформите сообщение в соответствии с требованиями: Рекомендации по оформлению сообщений в форуме , пункт 6

Особый упор - на исходные данные и желаемый вид результат на них. Ибо словесная постановка задачи у вас прихрамывает на обе ноги...
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720978
westvovik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина АннаwestvovikЩукина Анна,

Ну и будут не уникальные ID в таком запросе, думаете это не попробовал "ON" специально было выделено и подчеркнуто. Но если оно вам не подходит - то тут дело не в инструменте, а в неумении им пользоваться...

Если мы используем:

SELECT DISTINCT ON (id) o.* FROM orders_t o ORDER BY to_total_rub DESC LIMIT 25

То получаем: SELECT DISTINCT ON expressions must match initial ORDER BY expressions

Если мы используем:

SELECT DISTINCT ON (id, to_total_rub) o.* FROM orders_t o ORDER BY to_total_rub DESC LIMIT 25

То запрос выдаст строчки где будут присутствовать id дважды если будут одинаковые значения в поле to_total_rub, что не допустимо!
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720985
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
westvovikЩукина Аннапропущено...
"ON" специально было выделено и подчеркнуто. Но если оно вам не подходит - то тут дело не в инструменте, а в неумении им пользоваться...

Если мы используем:

Код: sql
1.
SELECT * from(SELECT DISTINCT ON (id) o.* FROM orders_t o ORDER BY id) foo  ORDER BY to_total_rub DESC LIMIT 25



То получаем: SELECT DISTINCT ON expressions must match initial ORDER BY expressions

Если мы используем:

SELECT DISTINCT ON (id, to_total_rub) o.* FROM orders_t o ORDER BY to_total_rub DESC LIMIT 25

То запрос выдаст строчки где будут присутствовать id дважды если будут одинаковые значения в поле to_total_rub, что не допустимо!
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720987
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
westvovik,

ps я не люблю "дистинкт он" по другой причине -- под него поленились реализовать очевидные алгоритмы
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720988
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
westvovikЩукина Аннапропущено...
"ON" специально было выделено и подчеркнуто. Но если оно вам не подходит - то тут дело не в инструменте, а в неумении им пользоваться...

Если мы используем:

SELECT DISTINCT ON (id) o.* FROM orders_t o ORDER BY to_total_rub DESC LIMIT 25

То получаем: SELECT DISTINCT ON expressions must match initial ORDER BY expressions

Если мы используем:

SELECT DISTINCT ON (id, to_total_rub) o.* FROM orders_t o ORDER BY to_total_rub DESC LIMIT 25

То запрос выдаст строчки где будут присутствовать id дважды если будут одинаковые значения в поле to_total_rub, что не допустимо!

Код: plsql
1.
SELECT id FROM (SELECT DISTINCT ON (id) id, to_total_rub FROM orders_t o ORDER BY id, to_total_rub DESC) AS _t ORDER BY to_total_rub DESC



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru [/quot]
...
Рейтинг: 0 / 0
Помогите с запросом
    #39720990
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk, oh, yes
...
Рейтинг: 0 / 0
Помогите с запросом
    #39721100
westvovik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Bogukwestvovikпропущено...


Если мы используем:

SELECT DISTINCT ON (id) o.* FROM orders_t o ORDER BY to_total_rub DESC LIMIT 25

То получаем: SELECT DISTINCT ON expressions must match initial ORDER BY expressions

Если мы используем:

SELECT DISTINCT ON (id, to_total_rub) o.* FROM orders_t o ORDER BY to_total_rub DESC LIMIT 25

То запрос выдаст строчки где будут присутствовать id дважды если будут одинаковые значения в поле to_total_rub, что не допустимо!

Код: plsql
1.
SELECT id FROM (SELECT DISTINCT ON (id) id, to_total_rub FROM orders_t o ORDER BY id, to_total_rub DESC) AS _t ORDER BY to_total_rub DESC



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru [/quot]

Спасибо, все работает)
...
Рейтинг: 0 / 0
Помогите с запросом
    #39721177
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
westvovik,

Если у вас таблица большая то запрос будет очень небыстро работать (n*log(n) от количества записей)...
Можно сделать сильно более сложный запрос если вам не все id надо а topN по total_rub (n - 1-10000 но не миллионы) (время пропорциональное N) (предполагая что значения total_rub в основном уникальны).

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru [/quot]
...
Рейтинг: 0 / 0
Помогите с запросом
    #39721349
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Bogukwestvovik,

Если у вас таблица большая то запрос будет очень небыстро работать (n*log(n) от количества записей)...
Можно сделать сильно более сложный запрос если вам не все id надо а topN по total_rub (n - 1-10000 но не миллионы) (время пропорциональное N) (предполагая что значения total_rub в основном уникальны).

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru


при наличии опорной таблички уникальных ид запрос будет сильно более простым (лейтерал к опорной)
но нужна уверенность типа фк в покрытии мн-ва ид опорным.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39721400
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

Я скорее думал о том чтобы идти просто по total_rub и отбирать нужное количество уникальных id. Там конечно возможны патологические случаи данных но в среднем должно быть лучше чем всю таблицу сканить.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru [/quot]
...
Рейтинг: 0 / 0
Помогите с запросом
    #39721422
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

идея понятна, но потом оффсет потребуется

я думал про раскладку всего по максу без лимитов

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


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