Взятие записи с максимальной датой - PullRequest
26 голосов
/ 17 января 2012

Давайте предположим, что я извлек некоторый набор данных.

т.е.

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)

Но мой запрос действительно длинный ... есть ли более компактный способ использовать АНАЛИТИЧЕСКУЮ ФУНКЦИЮ для того же?

Ответы [ 6 ]

51 голосов
/ 17 января 2012

Подход аналитической функции будет выглядеть примерно так:

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.

18 голосов
/ 17 января 2012

Если 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
9 голосов
/ 17 января 2012

Вы также можете использовать:

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
2 голосов
/ 07 декабря 2017

A - это ключ, max (дата) - это значение, мы могли бы упростить запрос, как показано ниже:

SELECT distinct A, max(date) over (partition by A)
  FROM TABLENAME
1 голос
/ 19 января 2016

Ответ Джастина Кейва - лучший, но если вы хотите другой вариант, попробуйте это:

select A,col_date
from (select A,col_date
    from tablename 
      order by col_date desc)
      where rownum<2
0 голосов
/ 26 июня 2015
SELECT mu_file, mudate
  FROM flightdata t_ext
 WHERE mudate = (SELECT MAX (mudate)
                     FROM flightdata where mudate < sysdate)
...