![]() |
|
| Правила Форума редакция от 22.06.2020 |
|
|||||||
|
|
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже. |
|
![]() |
|
|
Опции темы | Опции просмотра |
Language
|
|
|
#1
|
|
Постоялец
![]() ![]() ![]() Пол:
Регистрация: 02.07.2009
Сообщений: 393
Репутация: 79
|
Запрос, по сути, элементарный, но я жестоко туплю...
Есть таблица из трёх полей: id (pk), pid, timestamp Комбинация pid+timestamp уникальна. Что нужно: получить id кортежа с максимальным тайм-штампом для заданного пида. (сорь если косноязычно сформулировал). При чём, кортеж должен возвращаться только один. Варианты с join'ами, и top'ами не устраивают - максимум вложенный запрос. Заранее спасибо.
__________________
Каждый человек, которому вы ответили на форуме "гугл в помощь" - потенциальный "возвращенец" в винды. (ц) |
|
|
|
| Реклама: | Мебельный магазин: стол компьютерный 2000х800 - Переходи на сайт! | Мебельный магазин: шкаф напольный узкий - Переходи на сайт! | смесительный узел sumxk20-d-1,6(25-60) (kvs=1.6) (ск. 1) | Мебельный магазин: узкий шкаф для обуви в прихожую - Переходи на сайт! | клапан обратный ко-2 оцин. d630 0,9мм |
|
|
#2
|
|
Новичок
![]() Пол:
Регистрация: 05.01.2010
Сообщений: 19
Репутация: 2
|
Либо на самом деле язык сильно косноязычен, но кажется вот так:
select id from TABLE where pid=?Pid and TimeStamp = (select max(TimeStamp) from Table) |
|
|
|
| Сказали спасибо: |
|
|
#3
|
|
Неактивный пользователь
Пол:
Регистрация: 25.04.2008
Сообщений: 34
Репутация: 15
|
хз надо попробовать, но возможно еще проще
select id, max(timestamp) from table where pid=1 group by id |
|
|
|
| Сказали спасибо: |
|
|
#4
|
|
Неактивный пользователь
Пол:
Регистрация: 13.11.2009
Сообщений: 2
Репутация: 1
|
как раз без ТОПа - нет гарантии что будет получен именно единственная запись,
если макс timestamp для pid - НЕ уникальный но, навсякей, ишо вариантик select id, timestamp from table t1 where pid=1 and timestamp >= all (select timestamp from table t2 where t1.pid=t2.pid) |
|
|
|
| Сказали спасибо: |
|
|
#5
|
|
Новичок
Пол:
Регистрация: 27.12.2006
Сообщений: 14
Репутация: 9
|
Примерно так
select id from table where pid=1 order by timestamp desc rows 1 to 1 |
|
|
|
| Сказали спасибо: |
|
|
#6
|
|||||||||||||||||||||||
|
Постоялец
![]() ![]() ![]() Пол:
Регистрация: 02.07.2009
Сообщений: 393
Репутация: 79
|
В итоге получился такой же запрос, только во вложенном запросе добавил условие по pid. Всем спасибо.
__________________
Каждый человек, которому вы ответили на форуме "гугл в помощь" - потенциальный "возвращенец" в винды. (ц) |
|||||||||||||||||||||||
|
|
|
|
|
#7
|
|
Неактивный пользователь
Пол:
Регистрация: 05.02.2011
Сообщений: 10
Репутация: 0
|
если есть проблемы с сложным запросом то лучшее решение использовать временные таблицы и упростить запрос
|
|
|
|
|
|
#8
|
|||||||||||||||||||||||
|
Новичок
Пол:
Регистрация: 16.02.2012
Сообщений: 8
Репутация: 0
|
Вообще, это запрос тяжелый достаточно. Запрос с сортировкой гораздо проще. В постгресе можно получить для нескольких значений одним запросом: SELECT DISTINCT ON (Pid) Id, Pid, TimeStamp FROM TABLE WHERE Pid IN (?PidList) ORDER BY Pid, TimeStamp DESC В MsSQL, для одного значения Pid точно можно получить одним запросом: SELECT TOP 1 Id, Pid, TimeStamp FROM TABLE WHERE Pid = ?PidList ORDER BY TimeStamp DESC |
|||||||||||||||||||||||
|
|
|
|
|
#9
|
|
Новичок
Пол:
Регистрация: 04.04.2012
Сообщений: 16
Репутация: 1
|
m.pid=pid sele max(timestamp) from таблица where pid=m.pid group by id |
|
|
|
|
|
#10
|
|
Новичок
Пол:
Регистрация: 24.10.2014
Сообщений: 6
Репутация: 0
|
Тут всё просто, используйте row_number
select [id] = t.id from ( select [id] = t.id, [pid] = t.pid, [timestamp] = t.timestamp, [row] = row_number () over (partition by t.pid order by t.timestamp desc) from table t) as t where t.row = 1 and t.pid = value |
|
|
|