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



我一直在尝试更新我们在游戏SE网站上使用的DataExplorer上的查询,以跟踪标签而无需摘录,以在结果中包含增量行号,以便更轻松地读取返回的值。 这里有许多问题讨论如何做到这一点,例如这个和这个似乎对这些用户有效,但我似乎无法让它适合我的情况。

需要明确的是,我想要这样的东西:

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 BYRowId列变成了似乎是随机数。

考虑到表格的结构方式,我想做的事情可以实现吗?如果是这样,SQL 应该是什么?

要访问分叉查询,可以使用此链接。 原始查询(在我的更改之前)如果有任何帮助,可以在此处找到。

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

具体说来:

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子句匹配,因此您将获得预期的输出。

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

SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RowId

轰,完成了!

我使用了它,例如,我在原始表中添加了一列,该列的值增量值为 1

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

之后,使用列 ID 排序执行查询

select * from ur_table (query) order by id

相关内容

  • 没有找到相关文章

最新更新