web-dev-qa-db-ja.com

DB2のROW_NUMBER()

DB2データベースのwhere句でROW_NUMBER()を使用する方法。私は以下を試しましたが、うまくいきませんでした:

SELECT * FROM CSPAPP.LOCATIONS
WHERE (ROW_NUMBER() OVER(ORDER BY LOCATION)) BETWEEN 100 AND 200

エラーが発生しました:集計関数の無効な使用またはOLAP関数。

私はまた、次の方法で試しました:

SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,* FROM CSPAPP.LOCATIONS
WHERE RN < 200

SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,LOCATION FROM CSPAPP.LOCATIONS
WHERE RN < 200
11
Mandar

定義されているのと同じレベルでエイリアスを参照することはできません。これを派生テーブルにラップする必要があります。

SELECT location
FROM (
   SELECT row_number() over(order by location) as rn, 
          location 
   FROM cspapp.locations
)   
WHERE rn < 200

ISeries DB2の行番号に基づいて選択する場合、次のようなものを使用します。

SELECT *
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY location) as RRN, *
    FROM CSPAPP.LOCATIONS
    )
WHERE RRN between 100 and 200

1フィールドのみに関心がある場合は、選択に名前を割り当てて、フィールドを参照できる場合があります。

SELECT DATA.location
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY location) as RRN, *
    FROM CSPAPP.LOCATIONS
    ) as DATA
WHERE DATA.RRN between 100 and 200
6
clutton

Row_numberの代わりにFETCH FIRST 200 ROWS ONLYを試すことができます。 ROW_NUMBERを使用せずに通常どおりselectを記述し、必要なもので並べ替えて、最初にFETCH xします。

「*」ですべての列を選択することはお勧めできません特に 600+列がある場合(そしてそれ自体はデータベースの設計が悪い)。

3
Sinisa Hajnal

Row_number()関数を使用しない場合:

SELECT * FROM 
(SELECT * FROM CSPAPP.LOCATIONS ORDER BY LOCATION FETCH FIRST 200 rows only)
ORDER BY LOCATION DESC FETCH FIRST 100 rows only;

With Row number:

SELECT ROW_NUMBER() OVER(ORDER BY LOCATIONS), LOCATIONS as RNM FROM 
(SELECT * FROM CSPAPP.LOCATIONS ORDER BY LOCATIONS FETCH FIRST 200 rows only)
ORDER BY LOCATIONS DESC FETCH FIRST 100 rows only;
2
Md. Kamruzzaman