如何使用ROW_NUMBER和order by

时间:2015-10-08 10:43:13

标签: sql sql-server sql-server-2008

SELECT *
FROM My table A
ORDER BY ROW_NUMBER() OVER(ORDER BY 1)

使用此获取错误时 窗口函数和NEXT VALUE FOR函数不支持整数索引作为ORDER BY子句表达式。

我如何才能使它发挥作用。

TIA

4 个答案:

答案 0 :(得分:7)

您的查询毫无意义。您实际上并没有在外部查询中指定order by条件,所以为什么要这么麻烦?

也许你想要添加一个"行号"输出值。如果是,那么row_number()属于select,而不属于order by

SELECT A.*, ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM Mytable A;

SQL Server不允许ORDER BY中的常量值 - 在窗口函数或ORDER BY子句中。 SELECT NULL子查询是解决这个问题的一种方法。通常,ORDER BY中的整数表达式是一个索引,指的是要排序的列。这适用于ORDER BY子句,但不适用于窗口函数。 SQL Server也拒绝其他常量。

根据我的经验,这不会产生额外的排序。据我所知,这并没有记录在案。

答案 1 :(得分:0)

这可以改写为:

SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RN
FROM [My table] AS A
ORDER BY RN;

答案 2 :(得分:0)

你不能在order by子句中使用row_number()函数。你可以这样做..

SELECT ROW_NUMBER() OVER(ORDER BY 1) as Rno, * FROM My table A order by rno

 with cte as
    (
    SELECT ROW_NUMBER() OVER(ORDER BY 1) as Rno, * FROM My table A 
    )
    select * from cte ORDER BY Rno 

答案 3 :(得分:0)

试试这个:

SELECT *,ROW_NUMBER() OVER(ORDER BY (SELECT 1)) as RN
FROM My_table_A
ORDER BY RN;