#sql #hiveql
Вопрос:
Я хотел бы запустить инструкцию select, которая выполняется и выбирает только самую новую запись по полю Record_timestampe для ключей teacher_id и student_id. Поэтому в любое время, когда он запускается, ему нужно предоставить только одну запись. как я мог это сделать, пожалуйста? Вывод может быть без поля Recored_timestampe. Спасибо
Комментарии:
1. Только одна запись? Или по одной записи на пару? Что делать, если в таблице несколько учеников и учителей?
2. Я немного изменил это, но в любом случае это должна быть только одна запись, даже если их много с одинаковыми ключами. Иногда идентификатор student_id может быть найден как нулевое значение, но запись все равно должна быть действительной для выбора. Я хотел бы сначала выбрать самую новую запись с идентификатором sutdnet_id, и если все идентификаторы student_id равны нулю для одного и того же идентификатора преподавателя, будет выбрана самая новая запись. Не могли бы вы помочь мне с этим, пожалуйста?
3. i.stack.imgur.com/kVFql.png Вот несколько примеров
Ответ №1:
Использование функции окна,разделенной на teacher_id и student_id, и сортировка ее по метке recorded_timestamp даст вам желаемый результат.
select * from(select teacher_id,student_id,teacher_name,comment ,recorded_timestamp, row_number() over(partition by teacher_id,student_id order by recorded_timestamp desc)as rownum from temp0607)out1 where rownum=1
Также вам, возможно, придется посмотреть, как хранится метка recorded_timestamp. Если он хранится в виде строки, вы можете преобразовать его в метку времени с помощью from_unixtime(unix_timestamp(recorded_timestamp,'dd/MM/yyyy HH:mm'),'dd/MM/yyyy HH:mm')
Комментарии:
1. Спасибо! Сегодня я обнаружил несколько случаев, которые немного меняют его цель. Иногда идентификатор student_id может быть найден как нулевое значение, но запись все равно должна быть действительной для выбора. Я хочу сначала выбрать самую новую запись с идентификатором sutdnet_id, и если все идентификаторы student_id равны нулю для одного и того же идентификатора преподавателя, будет выбрана самая новая запись. Не могли бы вы помочь мне с этим, пожалуйста?
2. @Matias021 можете ли вы добавить некоторые примеры записей и выходные данные, которые вы ожидаете для упомянутых вами сценариев. Это помогло бы найти решение. Также я предполагаю, что для каждой комбинации учитель, ученик вы ожидаете одну строку в качестве вывода, верно?
3. Вот оно для вас i.stack.imgur.com/kVFql.png
Ответ №2:
Во-первых, упорядочите запись по дате и времени
SELECT *,RANK() OVER (PARTITION BY student_id ORDER BY Recored_timestamp desc) as ranking
FROM #temp
Затем, если вы хотите узнать самую новую запись с идентификатором student_id, который не является нулевым, вы можете OUTER APPLY
добавить столбец, который не является нулевым идентификатором student_id.
OUTER APPLY (SELECT student_id
FROM #temp
WHERE #temp.teacher_id = ranktable.teacher_id
AND student_id IS NOT NULL
) AS jointable
Вот пример:
Create Table #temp
(
teacher_id int
,student_id int
,teacher_name varchar(40)
,comment varchar(100)
,Recored_timestamp datetime
)
INSERT INTO #temp
VALUES
(449,111,'lucy','Could be better','2021-05-04 07:00:00.000')
,(449,null,'lucy','smily','2021-05-11 07:00:00.000')
,(449,111,'lucy','not listening','2021-05-08 07:00:00.000')
,(448,null,'Toni','Good','2021-06-04 09:00:00.000')
,(448,222,'Toni','not doing as expected','2021-06-04 08:00:00.000')
SELECT DISTINCT teacher_id,
jointable.student_id,
teacher_name,
comment,
Recored_timestamp,
ranking
FROM
(
SELECT *,RANK() OVER (PARTITION BY teacher_id ORDER BY Recored_timestamp DESC) AS ranking
FROM #temp
) AS ranktable
OUTER APPLY (SELECT student_id
FROM #temp
WHERE #temp.teacher_id = ranktable.teacher_id
AND student_id IS NOT NULL
) AS jointable
WHERE ranking = 1 --only newest record will be extracted
Drop table #temp
Комментарии:
1. Спасибо! Сегодня я обнаружил несколько случаев, которые немного меняют его цель. Иногда идентификатор student_id может быть найден как нулевое значение, но запись все равно должна быть действительной для выбора. Я хочу сначала выбрать самую новую запись с идентификатором sutdnet_id, и если все идентификаторы student_id равны нулю для одного и того же идентификатора преподавателя, будет выбрана самая новая запись. Не могли бы вы помочь мне с этим, пожалуйста?
2. @Matias021 Я отредактировал свой ответ. Вы можете попробовать еще раз.
Ответ №3:
Вы можете основываться на этом запросе, чтобы получить самые свежие данные.
ВЫБЕРИТЕ ВЕРХНИЙ 1 * ИЗ ВНУТРЕННЕГО СОЕДИНЕНИЯ T1 С именем таблицы(ВЫБЕРИТЕ teacher_id, Max(Метка времени записи) как maxDate из ГРУППЫ имен таблиц ПО ИДЕНТИФИКАТОРУ учителя) T2 НА T2.teacher_id = T1.teacher_id И T1.Отметка времени записи = T2.maxDate