如何在ROW_NUMBER()的PARTITION BY中使用自定义计算列?
问题描述
我在查询中定义了如下自定义列:
CASE WHEN Table.Column0 LIKE '%x%' THEN 'A' ELSE 'B' END AS 'CustomColumn',
当我使用以下语句对数据进行分区时:
ROW_NUMBER() OVER (PARTITION BY Table.Column1, Table.Column2 ORDER BY Table.Column3 ASC) AS g2
该语句可正常运行,但我希望将CustomColumn也加入分区条件以进一步拆分数据。即使使用[]包裹该列,SQL Server仍提示:
Invalid column name 'CustomColumn'
虽然数据预览中能正常显示该列,但无法在PARTITION BY中引用。请问是否有办法将CustomColumn加入ROW_NUMBER() OVER (PARTITION...)语句中?
解决方法
SQL Server的查询执行顺序决定了,SELECT子句中定义的别名无法直接在同层级的OVER()子句里引用——因为OVER()的逻辑执行早于SELECT子句的别名解析。你可以通过以下两种方式解决:
方法1:直接重复自定义列的逻辑
把生成CustomColumn的CASE表达式直接写入PARTITION BY中,示例代码:
ROW_NUMBER() OVER ( PARTITION BY Table.Column1, Table.Column2, CASE WHEN Table.Column0 LIKE '%x%' THEN 'A' ELSE 'B' END ORDER BY Table.Column3 ASC ) AS g2
这种方式简单直接,适合逻辑不复杂的场景。
方法2:使用子查询或CTE(公用表表达式)
先将包含CustomColumn的结果集作为子查询或CTE,再在外层查询中引用该列完成分区:
CTE示例:
WITH CTE_WithCustomCol AS ( SELECT Table.Column1, Table.Column2, Table.Column3, CASE WHEN Table.Column0 LIKE '%x%' THEN 'A' ELSE 'B' END AS CustomColumn FROM Table ) SELECT *, ROW_NUMBER() OVER ( PARTITION BY Column1, Column2, CustomColumn ORDER BY Column3 ASC ) AS g2 FROM CTE_WithCustomCol
子查询示例:
SELECT *, ROW_NUMBER() OVER ( PARTITION BY Column1, Column2, CustomColumn ORDER BY Column3 ASC ) AS g2 FROM ( SELECT Table.Column1, Table.Column2, Table.Column3, CASE WHEN Table.Column0 LIKE '%x%' THEN 'A' ELSE 'B' END AS CustomColumn FROM Table ) AS SubQuery
这种方式更清晰,当自定义列逻辑复杂时,能避免重复代码,提升查询可读性。
内容的提问来源于stack exchange,提问作者Boris
相关产品推荐
相关产品推荐

