|
Помогите с запросом
|
|||
---|---|---|---|
#18+
Есть таблица к примеру след вида: 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 12:16 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
Да, забыл добавить к запросу LIMIT на вывод записей ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 13:11 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
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 разные , но влияют на место в отсортированном наборе? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 14:18 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
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 по заданному лимиту ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 14:38 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
westvovik, Код: sql 1. 2. 3.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 14:59 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
westvovik, Distinct ON ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 15:03 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
Щукина Аннаwestvovik, Distinct ON Еслиб так все было просто) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 15:09 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
westvovik, Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 15:11 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
Павел Воронцовwestvovik, Код: sql 1. 2. 3.
? мах - очень будет медленно на больших таблицах плюс если будет необходимо по трем столбцам сделать такую сортировку с выборкой, я думаю загнется все, я вот в сторону WITH думаю ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 15:13 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
westvovik, И что ты про with думаешь? Почему будет медленно? При каких условиях? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 15:15 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
westvovikЩукина Аннаwestvovik, Distinct ON Еслиб так все было просто)в исходный условиях, поставленным в посте 1 и 2 - именно так всё просто... https://postgrespro.ru/docs/postgrespro/9.5/sql-select SELECT DISTINCT ON ( выражение [, ...] ) сохраняет только первую строку из каждого набора строк, для которого данное выражение даёт одинаковые значения. Выражения DISTINCT ON обрабатываются по тем же правилам, что и выражения ORDER BY (см. выше). Заметьте, что «первая строка» каждого набора непредсказуема, если только не применяется предложение ORDER BY, определяющее, какие строки должны быть первыми. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 15:33 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
Павел Воронцов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 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 15:35 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
Щукина Анна, Ну и будут не уникальные ID в таком запросе, думаете это не попробовал ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 15:37 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
По сути мне после сортировки нужно получить от каждой группы строк по одной строчке и выбрать эти id от туда ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 15:45 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
westvovikЩукина Анна, Ну и будут не уникальные ID в таком запросе, думаете это не попробовал "ON" специально было выделено и подчеркнуто. Но если оно вам не подходит - то тут дело не в инструменте, а в неумении им пользоваться... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 15:47 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
westvovikПо сути мне после сортировки нужно получить от каждой группы строк по одной строчке и выбрать эти id от туда оформите сообщение в соответствии с требованиями: Рекомендации по оформлению сообщений в форуме , пункт 6 Особый упор - на исходные данные и желаемый вид результат на них. Ибо словесная постановка задачи у вас прихрамывает на обе ноги... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 15:49 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
Щукина Анна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, что не допустимо! ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 15:57 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
westvovikЩукина Аннапропущено... "ON" специально было выделено и подчеркнуто. Но если оно вам не подходит - то тут дело не в инструменте, а в неумении им пользоваться... Если мы используем: Код: sql 1.
То получаем: 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, что не допустимо! ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 16:04 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
westvovik, ps я не люблю "дистинкт он" по другой причине -- под него поленились реализовать очевидные алгоритмы ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 16:07 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
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.
-- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru [/quot] ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 16:07 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
Maxim Boguk, oh, yes ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 16:09 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
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.
-- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru [/quot] Спасибо, все работает) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 18:12 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
westvovik, Если у вас таблица большая то запрос будет очень небыстро работать (n*log(n) от количества записей)... Можно сделать сильно более сложный запрос если вам не все id надо а topN по total_rub (n - 1-10000 но не миллионы) (время пропорциональное N) (предполагая что значения total_rub в основном уникальны). -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru [/quot] ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2018, 00:20 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
Maxim Bogukwestvovik, Если у вас таблица большая то запрос будет очень небыстро работать (n*log(n) от количества записей)... Можно сделать сильно более сложный запрос если вам не все id надо а topN по total_rub (n - 1-10000 но не миллионы) (время пропорциональное N) (предполагая что значения total_rub в основном уникальны). -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru при наличии опорной таблички уникальных ид запрос будет сильно более простым (лейтерал к опорной) но нужна уверенность типа фк в покрытии мн-ва ид опорным. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2018, 12:02 |
|
Помогите с запросом
|
|||
---|---|---|---|
#18+
qwwq, Я скорее думал о том чтобы идти просто по total_rub и отбирать нужное количество уникальных id. Там конечно возможны патологические случаи данных но в среднем должно быть лучше чем всю таблицу сканить. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru [/quot] ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2018, 12:59 |
|
|
start [/forum/topic.php?fid=53&fpage=49&tid=1995537]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 236ms |
total: | 364ms |
0 / 0 |