Использование 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)

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

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
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

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