1. ホーム
  2. sql

[解決済み] Oracleで上位100行を選択する方法は?

2022-03-16 21:50:17

質問

私の要件は、各クライアントの最新の注文を取得し、次に上位100レコードを取得することです。

私は、各顧客の最新の注文を取得するために、以下のように1つのクエリを書きました。内部クエリは問題なく動作します。しかし、私はその結果に基づいて最初の100を取得する方法がわかりません。

    SELECT * FROM (
      SELECT id, client_id, ROW_NUMBER() OVER(PARTITION BY client_id ORDER BY create_time DESC) rn 
      FROM order
    ) WHERE rn=1

何かアイデアはありますか?ありがとうございます。

解決方法は?

create_timeに注文が作成された時刻が含まれており、最新の注文を持つ100のクライアントが欲しいと仮定すると、以下のようになります。

  • 一番内側のクエリにcreate_timeを追加します。
  • で外側のクエリの結果を注文します。 create_time desc
  • を使用して最初の 100 行をフィルタリングする一番外側のクエリを追加します。 ROWNUM

クエリ

  SELECT * FROM (
     SELECT * FROM (
        SELECT 
          id, 
          client_id, 
          create_time,
          ROW_NUMBER() OVER(PARTITION BY client_id ORDER BY create_time DESC) rn 
        FROM order
      ) 
      WHERE rn=1
      ORDER BY create_time desc
  ) WHERE rownum <= 100

Oracle 12c用UPDATE

リリース 12.1 で、オラクルは トップNクエリ . 新しい FETCH FIRST... の構文を使用することもできます。

  SELECT * FROM (
    SELECT 
      id, 
      client_id, 
      create_time,
      ROW_NUMBER() OVER(PARTITION BY client_id ORDER BY create_time DESC) rn 
    FROM order
  ) 
  WHERE rn = 1
  ORDER BY create_time desc
  FETCH FIRST 100 ROWS ONLY)