Oracle: запись записи с максимальной датой
Предположим, что я извлекаю некоторый набор данных.
то есть.
SELECT A, date
FROM table
И я хочу только запись с максимальной датой (для каждого значения A). Я мог написать
SELECT A, col_date
FROM TABLENAME t_ext
WHERE col_date = (SELECT MAX (col_date)
FROM TABLENAME t_in
WHERE t_in.A = t_ext.A)
Но мой запрос действительно длинный... есть ли наиболее компактный способ использования АНАЛИТИЧЕСКОЙ ФУНКЦИИ, чтобы сделать то же самое?
Ответы
Ответ 1
Подход аналитической функции выглядел бы как
SELECT a, some_date_column
FROM (SELECT a,
some_date_column,
rank() over (partition by a order by some_date_column desc) rnk
FROM tablename)
WHERE rnk = 1
Обратите внимание, что в зависимости от того, как вы хотите обрабатывать связи (или возможны связи в вашей модели данных), вы можете использовать либо аналитическую функцию ROW_NUMBER
, либо DENSE_RANK
, а не RANK
.
Ответ 2
Если date
и col_date
- те же самые столбцы, которые вы должны просто сделать:
SELECT A, MAX(date) FROM t GROUP BY A
Почему бы не использовать:
WITH x AS ( SELECT A, MAX(col_date) m FROM TABLENAME )
SELECT A, date FROM TABLENAME t JOIN x ON x.A = t.A AND x.m = t.col_date
В противном случае:
SELECT A, FIRST_VALUE(date) KEEP(dense_rank FIRST ORDER BY col_date DESC)
FROM TABLENAME
GROUP BY A
Ответ 3
Вы также можете использовать:
SELECT t.*
FROM
TABLENAME t
JOIN
( SELECT A, MAX(col_date) AS col_date
FROM TABLENAME
GROUP BY A
) m
ON m.A = t.A
AND m.col_date = t.col_date
Ответ 4
Ответ Justin Cave - лучший, но если вы хотите вариант antoher, попробуйте следующее:
select A,col_date
from (select A,col_date
from tablename
order by col_date desc)
where rownum<2
Ответ 5
A - это ключ, max (date) - это значение, мы можем упростить запрос, как показано ниже:
SELECT разный A, максимальный (дата) над (разбиение на A) FROM TABLENAME
Ответ 6
SELECT mu_file, mudate
FROM flightdata t_ext
WHERE mudate = (SELECT MAX (mudate)
FROM flightdata where mudate < sysdate)