如何使用ROW_NUMBER()在SELECT中获取增量“RowId”列

时间:2017-05-08 22:42:55

标签: sql sql-server dataexplorer

我一直在尝试更新我们在游戏SE网站上使用的DataExplorer上的a query,以跟踪标记而不摘录,以在结果中包含增量行号,以便更轻松地读取返回值。这里有很多问题可以讨论如何执行此操作,例如this onethis one似乎对这些用户有效,但我似乎无法让它适用于我的情况

要说清楚,我想要这样的事情:

RowId | TagName | Count | Easy List Formatting
----------------------------------------------
1     | Tag1    | 6     | 1. [tag:tag1] (6)
2     | Tag2    | 6     | 1. [tag:tag2] (6)
3     | Tag3    | 5     | 1. [tag:tag3] (5)
4     | Tag4    | 5     | 1. [tag:tag4] (5)

到目前为止,我想出的是:

SELECT ROW_NUMBER() OVER(PARTITION BY TagInfo.[Count] ORDER BY TagInfo.TagName ASC) AS RowId, * 
FROM
(
   SELECT
   TagName,
   [Count],
   concat('1. [tag:',concat(TagName,concat('] (', concat([Count],')')))) AS [Easy List Formatting]
   FROM Tags
   LEFT JOIN Posts pe on pe.Id = Tags.ExcerptPostId
   LEFT JOIN TagSynonyms on SourceTagName = Tags.TagName
   WHERE coalesce(len(pe.Body),0) = 0 and ApprovalDate is null
) AS TagInfo
ORDER BY TagInfo.[Count] DESC, TagInfo.TagName

这产生了接近我想要的东西,但并不完全。 RowId列会递增,但一旦Count列发生更改,它就会重置(可能是因为PARTITION BY)。但是,如果我删除了PARTITION BY,则RowId列会变成似乎是随机数的列。

考虑到表格的结构,我想要做的是什么?如果是这样,SQL应该是什么?

要访问分叉查询,您可以使用this link。如果原始查询有帮助,可以找到原始查询(在我的更改之前)here

2 个答案:

答案 0 :(得分:2)

删除PARTITION BY正是所需要的。您的数字看起来是随机的原因是外部查询的ORDER BYORDER BY的{​​{1}}不同。您所要做的就是使它们相同,并且序列项目的输出将具有您期望的单调递增值。

具体做法是:

ROW_NUMBER()

现在您没有分区,并且两个SELECT ROW_NUMBER() OVER (ORDER BY TagInfo.[Count] DESC, TagInfo.TagName) AS RowId, * FROM ( ... ) AS TagInfo ORDER BY TagInfo.[Count] DESC, TagInfo.TagName 子句匹配,因此您将获得预期的输出。

对于它的价值,你在技术上甚至不关心在ORDER BY中拥有ORDER BY,你只需要与最终结果集相同的顺序。在这种情况下,您可以通过在ROW_NUMBER()中提供无意义的ORDER BY子句来欺骗查询引擎:

ROW_NUMBER()
砰的一声,完成了!

答案 1 :(得分:0)

我使用它的一些方法,例如,在原始表中添加一列,其增量值为1

ALTER TABLE ur_table ADD id INT IDENTITY(1,1) 
GO

之后,按列ID进行查询

select * from ur_table (query) order by id