Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите составить запрос / 9 сообщений из 9, страница 1 из 1
02.02.2007, 14:26
    #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
02.02.2007, 16:08
    #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
02.02.2007, 16:44
    #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
02.02.2007, 17:00
    #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
02.02.2007, 17:07
    #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
02.02.2007, 17:34
    #34303270
webonata
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить запрос
Да, вы правы, спасибо!
...
Рейтинг: 0 / 0
02.02.2007, 17:39
    #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
27.07.2007, 12:49
    #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
27.07.2007, 13:09
    #34688779
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить запрос
посмотрите на название форума, там есть слово access?
вам в другой форум надо обратиться )
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите составить запрос / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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