У меня есть таблица ниже.
Я БЫ | Описание | прогресс | update_time |
---|---|---|---|
1 | abcd | запланированный | 20.04.2022 10:00 |
1 | abcd | запланированный | 25.04.2022 00:00 |
1 | abcd | в ходе выполнения | 2022-04-26 16:00 |
1 | abcd | в ходе выполнения | 04.05.2022 11:00 |
1 | abcd | в ходе выполнения | 06.05.2022 12:00 |
Я просто хочу вернуть строку с последним update_time независимо от того, в каком прогрессе она находится, то есть
Я БЫ | Описание | прогресс | update_time |
---|---|---|---|
1 | abcd | в ходе выполнения | 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)
Я также получаю следующую ошибку, «Несколько столбцов, возвращаемых подзапросом, еще не поддерживаются»
Вы пытаетесь сопоставить одно значение с несколькими столбцами, и у вас возникает ошибка.
Глядя на ваш код для вашей цели, вместо предложения 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 |
---|---|---|---|
1 | abcd | в ходе выполнения | 2022-05-07 12:00:00.000 |
2 | abcd | в ходе выполнения | 2022-05-06 12:00:00.000 |
Все они работали! Большое спасибо!