【问题标题】:How to use ROW_NUMBER with order by如何使用 ROW_NUMBER 和 order by
【发布时间】:2015-10-08 18:53:29
【问题描述】:
SELECT *
FROM My table A
ORDER BY ROW_NUMBER() OVER(ORDER BY 1)

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

我怎样才能让它工作。

TIA

【问题讨论】:

  • 正如错误所说:您不能在 ROW_NUMBER 内的 ORDER BY 中使用列号,这仅适用于整个语句的 ORDER BY。每个单独的列都需要 ROW_NUMBER 吗?

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


【解决方案1】:

您的查询毫无意义。您并没有真正在外部查询中指定 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 也拒绝其他常量。

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

【讨论】:

    【解决方案2】:

    这可以改写为:

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

    【讨论】:

    • 你的桌子真的是My table吗?如果是这样,这需要用方括号括起来。如果它仍然不起作用,请告诉我什么不起作用。
    【解决方案3】:

    您不能按子句顺序使用 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 
    

    【讨论】:

      【解决方案4】:

      试试这个:

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

      【讨论】:

      • @user1844634:- 你遇到错误了吗?如果是,那是什么?
      • select 1 是什么意思?是 1 是列号。?即使我把它作为 1,2,3,4 .. 给我同样的结果。我想通过给出列号按不同的列对表格进行排序
      • @user1844634:- 是的,对于任何值,您都会收到相同的结果。检查戈登在他提到的地方的回答:SQL Server does not permit constant values in ORDER BY -- either in a window function or in the ORDER BY clause. The SELECT NULL subquery is a way around this
      • @user1844634:- 你也可以查看What does “ORDER BY (SELECT NULL)” mean?
      猜你喜欢
      • 2017-10-21
      • 2019-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 2012-09-23
      • 2010-10-24
      相关资源
      最近更新 更多