web-dev-qa-db-ja.com

最大日付で記録を取る

一連のデータを抽出すると仮定しましょう。

つまり.

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)

しかし、私のクエリは本当に長い...アナリティック関数を使用して同じことを行うよりコンパクトな方法はありますか?

26
Revious

分析関数のアプローチは次のようになります

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_RANKRANKではなく分析関数。

51
Justin Cave

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
18
Benoit

以下も使用できます。

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
9
ypercubeᵀᴹ

Aがキー、max(date)が値です。以下のようにクエリを単純化できます。

SELECT distinct A, max(date) over (partition by A)
  FROM TABLENAME
2
user2778168

Justin Caveの答えは最高ですが、別のオプションが必要な場合は、これを試してください:

select A,col_date
from (select A,col_date
    from tablename 
      order by col_date desc)
      where rownum<2
1
Aitor