DB2中的ROW_NUMBER()

Man*_*dar 11 sql db2

如何在DB2数据库的where子句中使用ROW_NUMBER().我在下面试过但它不起作用:

SELECT * FROM CSPAPP.LOCATIONS
WHERE (ROW_NUMBER() OVER(ORDER BY LOCATION)) BETWEEN 100 AND 200
Run Code Online (Sandbox Code Playgroud)

它给出了错误:无效使用聚合函数或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
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 7

您无法在定义它的同一级别上引用别名.您需要将其包装到派生表中:

SELECT location
FROM (
   SELECT row_number() over(order by location) as rn, 
          location 
   FROM cspapp.locations
)   
WHERE rn < 200
Run Code Online (Sandbox Code Playgroud)

  • 然后从table_name`前缀`*`:`select row_number()...,table_name.*(或使用别名) (2认同)

clu*_*ton 6

在基于iSeries DB2中的行号进行选择时,我会使用类似的方法:

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

如果仅对1字段感兴趣,则可以为select分配一个名称并引用这些字段:

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
Run Code Online (Sandbox Code Playgroud)