2014-10-02 36 views
1

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

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

你试过''''ROW_NUMBER()''''?语法如下:'''ROW_NUMBER() OVER([PARTITION BY value_expression,... [n]] order_by_clause)''''。阅读更多@:http://msdn.microsoft.com/en-us/library/ms186734.aspx – 2014-10-02 12:40:57

+0

我试过,但没有成功,也许我应该再看看它 – manjuvreddy 2014-10-02 12:46:37

+1

你可能会张贴您正在尝试的查询用行号扩展,所以也许我们可以给你一个更好的答案,说明哪里出错了ROW_NUMBER()? – 2014-10-02 12:47:21

回答

1

如果排序列包含唯一值,你也可以做到这一点没有新的内置ROW_NUMBER()函数,通过使用基于排序列的子查询。

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

变化<<=开始在1计数0

+3

使用'row_number()'将比共同相关的标量子查询快得多。 – 2014-10-02 12:48:25

+0

绝对正确。子查询方法较慢,但值得了解... – 2014-10-02 12:49:45

+0

不是,'ROW_NUMBER()'是10岁,子查询将导致所有字段的顺序处理。这是一个明确的禁忌。如果你不能使用'ROW_NUBMER()',一个标准的技巧就是使用[只填充数字的辅助表](http://sqlmag.com/sql-server/virtual-auxiliary-table-numbers)来模拟序列。这个诀窍在2005年之前被使用,甚至被载入Oracle的DUAL表格。 – 2014-10-02 15:02:49

3

,而不是有没有必要,以避免解析函数,如果你的数据库支持他们如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这样的子句,如(PARTITION BY categoryId ORDER BY [<PRIMARYKEY_COLUMN_NAME>])

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

+0

注意:这个线程是旧的,但它在我的谷歌搜索跳转。 – Waqar 2014-11-26 13:36:11