powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите составить запрос
9 сообщений из 9, страница 1 из 1
Помогите составить запрос
    #34302411
webonata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите, пожалуйста.

Задача в том, что нужно получить 100 последних (c макс. lid) записей из таблицы links с неповторяющимся lid_group.

Я решаю это так:

select * from links where lid in
(select max(lid) from links where closed=0 group by lid_group)
order by lid desc limit 100

Можно ли как-то переписать запрос, избавиться от in (select..) или оптимизировать иначе, ведь по идее нет необходимости выбирать все макс. lid в каждой группе, если нужны только 100. А как это сделать, не соображу. :-/
...
Рейтинг: 0 / 0
Помогите составить запрос
    #34302929
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
webonataПомогите, пожалуйста.

Задача в том, что нужно получить 100 последних (c макс. lid) записей из таблицы links с неповторяющимся lid_group.

Я решаю это так:

select * from links where lid in
(select max(lid) from links where closed=0 group by lid_group)
order by lid desc limit 100

Можно ли как-то переписать запрос, избавиться от in (select..) или оптимизировать иначе, ведь по идее нет необходимости выбирать все макс. lid в каждой группе, если нужны только 100. А как это сделать, не соображу. :-/
Может:
Код: plaintext
1.
2.
select * from links where lid in
(select max(lid) from links where closed= 0  group by lid_group order by  1  desc limit  100 )
...
Рейтинг: 0 / 0
Помогите составить запрос
    #34303102
webonata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Andrey DaeronМожет:
Код: plaintext
1.
2.
select * from links where lid in
(select max(lid) from links where closed= 0  group by lid_group order by  1  desc limit  100 )
[/quot]

Эх, если так, то получится, что сначала выберутся 100 записей, разобьются на группы, и внутри каждой выберется макс. lid.
А мне же надо чтоб результатом запроса было 100 записей - каждая с макс. lid в свой группе :(
...
Рейтинг: 0 / 0
Помогите составить запрос
    #34303159
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
webonata Andrey DaeronМожет:
Код: plaintext
1.
2.
select * from links where lid in
(select max(lid) from links where closed= 0  group by lid_group order by  1  desc limit  100 )


Эх, если так, то получится, что сначала выберутся 100 записей, разобьются на группы, и внутри каждой выберется макс. lid.
А мне же надо чтоб результатом запроса было 100 записей - каждая с макс. lid в свой группе :(

Да нет.... Вначале будет group by работать, а потом уже order by по max(id) и лимит на 100 max(id). Т.е. сначала найдет максимальное в каждой группе, отсортирует по этим максимальным значениям, и возьмет только 100 максимальных значений. Проверьте! :-)
...
Рейтинг: 0 / 0
Помогите составить запрос
    #34303179
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
webonata[quot Andrey DaeronМожет:
Код: plaintext
1.
2.
select * from links where lid in
(select max(lid) from links where closed= 0  group by lid_group order by  1  desc limit  100 )


Эх, если так, то получится, что сначала выберутся 100 записей, разобьются на группы, и внутри каждой выберется макс. lid.
А мне же надо чтоб результатом запроса было 100 записей - каждая с макс. lid в свой группе :([/quot]
А если выполнить? Если бы было по Вашему, то кол-во записей было бы в результирующей выборке меньше 100. А если его выполнить то получится ровно 100
Более того. Пишем:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT * FROM links WHERE lID IN
(SELECT max(lid) FROM links where closed= 0  GROUP BY lid_group ORDER BY  1  DESC LIMIT  100 )
EXCEPT
(select * from links where lid in
(select max(lid) from links where closed= 0  group by lid_group)
order by lid desc limit  100 )
И наслаждаемся :)
У меня - эта выборка пустая.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #34303270
webonata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, вы правы, спасибо!
...
Рейтинг: 0 / 0
Помогите составить запрос
    #34303284
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
webonataПомогите, пожалуйста.

Задача в том, что нужно получить 100 последних (c макс. lid) записей из таблицы links с неповторяющимся lid_group.

Я решаю это так:

select * from links where lid in
(select max(lid) from links where closed=0 group by lid_group)
order by lid desc limit 100

Можно ли как-то переписать запрос, избавиться от in (select..) или оптимизировать иначе, ведь по идее нет необходимости выбирать все макс. lid в каждой группе, если нужны только 100. А как это сделать, не соображу. :-/
Правда мой вариант все равно приводит к seq_scan :( и планы не то что похожи, но отличаются не сильно, основное время таки seq_scan занимает.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #34688655
-red-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите мне решить эту же задачу, только для Access ?

а то у меня запрос
Код: plaintext
SELECT TOP  5  * FROM table1 WHERE ID IN (SELECT MAX(ID) FROM table1 WHERE column1 =  1  AND column2 = 'some value' ORDER BY ID) ORDER BY ID

выдает только первые 5 записей, а не последние :(
...
Рейтинг: 0 / 0
Помогите составить запрос
    #34688779
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотрите на название форума, там есть слово access?
вам в другой форум надо обратиться )
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите составить запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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