【问题标题】:SQL - ROW NUMBER with no Order BySQL - 没有 Order By 的 ROW NUMBER
【发布时间】:2017-08-10 06:30:29
【问题描述】:

我正在根据Date 列的顺序在我的查询中创建一个行号。

这是使用的查询:

SELECT * 
FROM 
    (SELECT 
         *, 
         ROW_NUMBER() OVER (ORDER BY datePunch) AS RowNum 
     FROM 
         Tempdata 
     WHERE
         datePunch IS NOT NULL) AS LogTable 
WHERE 
    LogTable.RowNum BETWEEN 800 
                    AND (SELECT COUNT(*) 
                         FROM Tempdata 
                         WHERE datePunch IS NOT NULL)
    AND datePunch IS NOT NULL

现在我想要行号列,但不是通过订购datePunch 列。我只想要记录,因为它们没有顺序地插入到表中。

可以这样做吗?

注意:-

我创建了一个同步客户端数据库的实用程序。所以数据库每次都会不同,不能保证标识列。我只是映射列并在我的查询中使用它们。

【问题讨论】:

  • 您有 IDENTITY 列吗?如果你没有那么它是不可能做到的。如果你有,那么你可以按 IDENTITY 列排序。
  • 我只想要记录,因为它们被插入到没有排序的表中 - 关系表中的行永远不会有隐式的、系统给定的排序 - 根本没有排序.因此,如果您不关心排序,您可以使用ORDER BY NEWID() 来获得随机排序并因此编号。 ROW_NUMBER 函数中的 ORDER BY 子句是必需的(根据文档)
  • @marc_s 我刚刚用 ROW_NUMBER blog.sqlauthority.com/2015/05/05/…得到了这个技巧
  • ROW_NUMBER 是查询运行时计算的临时值。要在表中保留数字,请参阅 IDENTITY 属性和 SEQUENCE。 --> docs.microsoft.com/en-us/sql/t-sql/functions/…
  • 为什么要避免指定订单?

标签: sql sql-server


【解决方案1】:

您似乎希望您的行始终以特定顺序返回(即“它们在表中插入的顺序”),但这不是一个有意义的概念。行不是按顺序插入的,它们在内部如何被索引和组织到 sqlserver 不是开发人员控制的,所以我建议你忘记有任何特定的行具有自然顺序的概念。

如果你想要一个稳定的行排序,保证不会基于sql server的索引维护等而改变,那么你真的需要在表中插入一些数据,以便在查询时对其进行排序。这可能是一个 create_date、一个递增的整数等

一些有趣的卫浴读物:https://www.red-gate.com/simple-talk/sql/database-administration/sql-server-storage-internals-101/

【讨论】:

    猜你喜欢
    • 2023-02-22
    • 2011-06-16
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多