Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / select со сложным условием. / 10 сообщений из 10, страница 1 из 1
16.08.2014, 14:08:06
    #38721740
sksystem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select со сложным условием.
Всем привет.

Помогите плиз со сложным запросом к pgsql.

Есть одна таблица, в ней текстовое id объекта и время time типа integer.

Что бы мне достать последнее сообщение по объекту я делаю:
SELECT MAX(time) FROM table WHERE id = '1111';

Это хорошо работает. Но, у меня много объектов и для каждого из них делается запрос к базе, все это долго. Как мне сделать одним запросом все эти обращения.
Что-то вроде
SELECT MAX(time) FROM table WHERE id IN ('111','2222');

Вся сложность в том, что этот запрос мне вернет одно сообщение с максимальным временем из всех объектов. А мне надо что бы оно для 30 объектов вернуло для каждого из них по сообщению с максимальным временем именно для этого объекта. Что-то вроде
SELECT MAX(time[id]) FROM table WHERE id IN ('111','2222');

Может кто сталкивался с пободной задачей?
...
Рейтинг: 0 / 0
16.08.2014, 14:15:13
    #38721741
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select со сложным условием.
sksystem,
Код: plsql
1.
2.
3.
4.
SELECT id, MAX(time) 
  FROM table 
 WHERE id IN ('111','2222');
 GROUP BY id
...
Рейтинг: 0 / 0
16.08.2014, 14:20:04
    #38721742
sksystem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select со сложным условием.
Павел Лузанов,

То что надо, спасибо, в понедельник попробую)
...
Рейтинг: 0 / 0
18.08.2014, 12:39:49
    #38722373
sksystem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select со сложным условием.
Попробовал сегодня выполнить запрос, в принципе он выполняется тот который надо, но есть нюанс:
мне надо вытянуть не только эти два столбца, а ещё и все другие столбцйы в таблице. И вот тут ступор.
...
Рейтинг: 0 / 0
18.08.2014, 12:46:24
    #38722388
sksystem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select со сложным условием.
Кажись нашел: select * from storage0 where (unit_id, time) in (SELECT unit_id, max(time) from storage0 WHERE unit_id IN ('75726','81295') group by unit_id);
...
Рейтинг: 0 / 0
18.08.2014, 13:17:21
    #38722428
roadster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select со сложным условием.
sksystemКажись нашел:нет, не нашли.
в запрос Павла Лазунова добавляете список всех необходимых полей и их же включаете в условие group by
но для начала почитайте это и это
ну и вообще ознакомиться с документацией не помешает
...
Рейтинг: 0 / 0
18.08.2014, 13:38:49
    #38722456
sksystem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select со сложным условием.
roadster,

Вы имеете виду вот так:
SELECT unit_id, MAX(id), MAX(time) FROM storage0 WHERE unit_id IN ('75726','81295') GROUP BY unit_id,id;
?
Продобавал так, выдает все сообщения, а не по одному объекту с максимальным временем.

В моей варианте выдает верный мне результат. Если найдете минутку, буду признателен если более подробно разясните.

По документации я из неё не вылажу, смотрю постоянно, за линки благодарю.
...
Рейтинг: 0 / 0
18.08.2014, 13:40:14
    #38722457
sksystem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select со сложным условием.
Ой, ошибся не так:
SELECT unit_id, MAX(id), MAX(time) FROM storage0 WHERE unit_id IN ('75726','81295') GROUP BY unit_id,id;
а вот так
SELECT unit_id, id, MAX(time) FROM storage0 WHERE unit_id IN ('75726','81295') GROUP BY unit_id,id;
хотя пробовал и так и так

Сразу скажу что в MySQL Ваш вариант отрабатывает, а в PgSql почему-то нет.
...
Рейтинг: 0 / 0
18.08.2014, 14:26:51
    #38722532
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select со сложным условием.
Если это PostgreSQL, то удобно использовать расширение DISTINCT ON :
Код: sql
1.
2.
3.
4.
SELECT DISTINCT ON id,time
    id,time,name,col1,col2,col3
  FROM tab
 ORDER BY id, time DESC



Основное требование: колонки указанные в `DISTINCT ON` конструкции должны быть первыми в `ORDER BY`.
...
Рейтинг: 0 / 0
18.08.2014, 16:18:03
    #38722673
--поправил
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select со сложным условием.
vyegorovЕсли это PostgreSQL, то удобно использовать расширение DISTINCT ON :
Код: sql
1.
2.
3.
4.
SELECT DISTINCT ON (id,time)
    id,time,name,col1,col2,col3
  FROM tab
 ORDER BY id, time DESC



Основное требование: колонки указанные в `DISTINCT ON` конструкции должны быть первыми в `ORDER BY`.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / select со сложным условием. / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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