32

いくつかのデータセットを抽出するとします。

すなわち

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)

しかし、私のクエリは本当に長いです... ANALYTIC FUNCTIONを使用して同じことを行うよりコンパクトな方法はありますか?

4

7 に答える 7

65

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

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

于 2012-01-17T16:26:39.503 に答える
20

dateとが同じ列である場合col_dateは、次のようにする必要があります。

SELECT A, MAX(date) FROM t GROUP BY A

使用しない理由:

WITH x AS ( SELECT A, MAX(col_date) m FROM TABLENAME GROUP BY A )
SELECT t.A, t.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
于 2012-01-17T16:24:05.000 に答える
9

次のものも使用できます。

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
于 2012-01-17T16:37:36.540 に答える
3

Aはキー、max(date)は値です。次のように、クエリを簡略化できます。

SELECT distinct A, max(date) over (partition by A)
  FROM TABLENAME
于 2017-12-07T06:34:04.613 に答える
1

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

select A,col_date
from (select A,col_date
    from tablename 
      order by col_date desc)
      where rownum<2
于 2016-01-19T11:36:00.160 に答える
1

Oracle 12C以降、。を使用して特定の数の行をフェッチできますFETCH FIRST ROW ONLY。あなたの場合、これはを意味するORDER BYので、パフォーマンスを考慮する必要があります。

SELECT A, col_date
FROM TABLENAME t_ext
ORDER BY col_date DESC NULLS LAST
FETCH FIRST 1 ROW ONLY;

これNULLS LASTは、フィールドにnull値がある場合に備えてです。

于 2021-02-15T23:33:26.757 に答える
-6
SELECT mu_file, mudate
  FROM flightdata t_ext
 WHERE mudate = (SELECT MAX (mudate)
                     FROM flightdata where mudate < sysdate)
于 2015-06-26T02:02:35.780 に答える