Использование Max() в предложении where в Presto SQL

У меня есть таблица ниже.

Я БЫОписаниепрогрессupdate_time
1abcdзапланированный20.04.2022 10:00
1abcdзапланированный25.04.2022 00:00
1abcdв ходе выполнения2022-04-26 16:00
1abcdв ходе выполнения04.05.2022 11:00
1abcdв ходе выполнения06.05.2022 12:00

Я просто хочу вернуть строку с последним update_time независимо от того, в каком прогрессе она находится, то есть

Я БЫОписаниепрогрессupdate_time
1abcdв ходе выполнения06.05.2022 12:00

Я знаю, что если я сгруппирую по «прогрессу» (как показано ниже), я также получу один для запланированного, который мне не нужен. Мне просто нужна одна строка для каждого идентификатора с последним обновленным временем.

Я написал следующий запрос,

select ID,desc,progress,updated_time 
from t1 
where updated_time IN (select ID, desc, progress, max(updated_time) 
from t1 group by 1,2,3)

Я также получаю следующую ошибку, «Несколько столбцов, возвращаемых подзапросом, еще не поддерживаются»

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
28
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы пытаетесь сопоставить одно значение с несколькими столбцами, и у вас возникает ошибка.

Глядя на ваш код для вашей цели, вместо предложения IN на основе подзапроса вы должны использовать внутреннее соединение

select ID,desc,progress,updated_time 
from t1 
INNER JOIN 
( select ID, desc, progress, max(updated_time) max_time 
from t1 group by 1,2,3) t on t.max_time = t1.updated_time

Я бы, вероятно, использовал для этого row_number или какую-либо другую функцию ранжирования.

with t as (select a.*,
 row_number() over (partition by id order by updated_time desc as rn) 
select * from t where rn = 1
Ответ принят как подходящий

Выбор нескольких значений в подзапросе не сработает, вам нужно выбрать одно значение с помощью скалярный подзапрос:

-- sample data
WITH dataset (ID, Desc, progress, updated_time) AS (
    VALUES 
(1, 'abcd', 'planned',  timestamp '2022-04-20 10:00'),
(1, 'abcd', 'planned',  timestamp '2022-04-25 12:00'),
(1, 'abcd', 'in progress',  timestamp '2022-04-26 16:00'),
(1, 'abcd', 'in progress',  timestamp '2022-05-04 11:00'),
(1, 'abcd', 'in progress',  timestamp '2022-05-06 12:00'),
(1, 'abcd', 'in progress',  timestamp '2022-05-07 12:00'),
(2, 'abcd', 'in progress',  timestamp '2022-05-04 11:00'),
(2, 'abcd', 'in progress',  timestamp '2022-05-06 12:00')
) 

--query
select  id, Desc, progress, updated_time
from dataset o
where updated_time = (select max(updated_time) from dataset i where i.id = o.id)

Или аналогичный подход с оконной функцией max и подзапросом:

--query
select  id, Desc, progress, updated_time
from (
    select *,  max(updated_time) over (partition by id) max_time
    from dataset
)
where max_time = updated_time

Или просто используя row_number:

select  id, Desc, progress, updated_time
from 
(
    select *,  
        row_number() over(partition by id order by updated_time desc) rank
    from dataset
)
where rank  = 1

Выход:

я быОписаниепрогрессupdate_time
1abcdв ходе выполнения2022-05-07 12:00:00.000
2abcdв ходе выполнения2022-05-06 12:00:00.000

Все они работали! Большое спасибо!

Mupp 16.05.2022 23:19

Другие вопросы по теме