【问题标题】:How to generate sequential row number in tsql?如何在sql中生成连续的行号?
【发布时间】:2014-10-02 12:37:48
【问题描述】:

我需要在报告中显示行中的替代颜色,为此我需要在 SQL Select 语句(参见下面的示例)中生成序列号,以便稍后在显示行时使用。 我正在尝试 row_number 和其他一些不起作用的技术。这不应该使用脚本来完成,我应该能够在 Select 语句中生成。感谢任何帮助。

RowNumber - 1, Otherdata - Something1
RowNumber - 2, Otherdata - Something2
RowNumber - 3, Otherdata - Something3
RowNumber - 4, Otherdata - Something4
RowNumber - 5, Otherdata - Something5

【问题讨论】:

  • 你试过ROW_NUMBER()吗?语法类似于:ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )。阅读更多@:msdn.microsoft.com/en-us/library/ms186734.aspx
  • 我试过了,但没有成功,也许我应该再看看它
  • 您能否发布您尝试使用行号扩展的查询,以便我们可以更好地回答您在 ROW_NUMBER() 哪里出错?
  • 我尝试了使用 Alex 提供的 MSDN 示例的 row_number 解决方案,并且这次工作。谢谢亚历克斯。

标签: sql sql-server-2008 tsql


【解决方案1】:

如果您的数据库支持分析函数,则无需避免使用它们,例如 ROW_NUMBER()

    SELECT
        ROW_NUMBER() OVER (ORDER BY [<PRIMARYKEY_COLUMN_NAME>]) AS Number
    FROM
        [<TABLE_NAME>]

语法为Func([ arguments ]) OVER (analytic_clause),需要重点关注OVER()。最后一个括号对您的行进行分区,并在这些分区上一一应用 Func()。在上面的代码中,我们只有单个行集/分区。因此生成的序列适用于所有行。

您可以一次性制作多组数据并为每个数据生成序列号。例如,如果您需要为所有具有相同 categoryId 的行集生成序列号。你只需要像(PARTITION BY categoryId ORDER BY [&lt;PRIMARYKEY_COLUMN_NAME&gt;]) 这样添加Partition By 子句。

请记住,在FROM 之后,您还可以使用另一个额外的ORDER BY 来对数据进行不同的排序。但是对OVER()没有影响

【讨论】:

  • 注意:这个帖子很旧,但它在我的谷歌搜索中跳了起来。
【解决方案2】:

如果排序列包含唯一值,您也可以不使用新的内置 Row_Number() 函数,而是使用基于排序列的子查询。

  Select [other stuff],
      (Select count(*) From table 
       where sortCol < a.sortCol) rowNum
  From table a
  Order by sortCol

将 &lt; 更改为 &lt;= 以从 1 而不是 0 开始计数

【讨论】:

  • 使用row_number() 会比相关的标量子查询快得多。
  • 不是真的,ROW_NUMBER() 已经 10 岁了,子查询将导致所有字段的顺序处理。这是一个明确的禁忌。如果您不能使用ROW_NUBMER(),一个标准技巧是使用auxiliary table filled only with numbers 来模拟序列。这个技巧在 2005 年之前就已经使用过了,甚至被载入了 Oracle 的 DUAL 表中。
  • 什么“不是真的”??!!您是否真的建议知道如何在各种场景中构造相关子查询是“不值得了解”?不管它在任何特定情况下的实用性或性能问题如何,这种技术绝对值得了解。
  • 简单而有效。我需要在没有主键的情况下进行查询。对于同一查询中的多次使用,值得将其放在cross apply 部分
  • +1 来抵消那些认为这个解决方案有任何本质问题的人。这是 2018 年,我有学生运行的 DBMS 软件版本还不支持窗口函数。好的,所以我告诉他们升级,但这并不总是他们可以控制的。我在 Microsoft SQL 中的测试表明,Window Functions 的速度大约快了 7 倍,但是,即使是 14 秒与 2 秒相比,它也是一个解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 2021-03-28
  • 2018-08-11
  • 2021-05-08
  • 1970-01-01
  • 2012-08-16
  • 2016-06-15
相关资源
最近更新 更多