Как выбрать все столбцы из подзапроса, который содержит только некоторые? - PullRequest
1 голос
/ 10 июля 2020

У меня есть следующий запрос:

SELECT id, MAX(`grab_time`) AS `grab_time` FROM events WHERE ended = false GROUP BY id

Это возвращает все записи с наибольшим grab_time по сравнению с другими записями, которые имеют такие же id.

Таблица events имеет четыре столбца, и я хочу их все. Мне посоветовали поместить указанный выше запрос в подзапрос, чтобы получить недостающие столбцы (отображается только 2), но я не знаю, как это сделать?

Как я могу сказать sql, чтобы в основном «ВЫБРАТЬ все, ГДЕ строки из строк в ()»?

Ответы [ 3 ]

1 голос
/ 10 июля 2020

Вы можете использовать IN как

select * from events 
where (id,grab_time) in
(SELECT id, MAX(`grab_time`) AS `grab_time` FROM events WHERE ended = false GROUP BY id)

Вы также можете использовать функцию MAX windows следующим образом:

select * from 
(
select t.*, max(grab_time) over (partition by id) as mx
from your_table where ended = false
)
where grab_time = mx
1 голос
/ 10 июля 2020

Одним из подходов может быть использование временных таблиц:

   with max_time as
   (
     select id,MAX(grab_time) as grab_time FROM events where ended='false' GROUP BY 
     id
   )
   select * from events e,max_time mt where e.id=mt.id and e.grab_time=mt.grab_time;
1 голос
/ 10 июля 2020

Вы можете использовать коррелированный подзапрос:

select e.*
from events e
where not e.ended and
      e.grab_time = (select max(e2.grab_time) from events e2 where e2.id = e.id and not e2.ended);

Вам нужен индекс events(id, ended, grab_time) для этого запроса.

Или используйте row_number():

select e.*
from (select e.*, row_number() over (partition by id order by grab_time desc) as seqnum
      from events e
      where not ended
     ) e
where seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...