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

Posted

技术标签:

【中文标题】如何使用 ROW_NUMBER() 在 SELECT 中获取增量“RowId”列【英文标题】:How to get an incremental "RowId" column in SELECT using ROW_NUMBER() 【发布时间】:2017-10-07 02:06:02 【问题描述】:

我一直在尝试更新我们在 Gaming SE 网站上使用的 DataExplorer 上的 a query,以便在没有摘录的情况下跟踪标签,以便在结果中包含递增的行号,以便更轻松地读取返回的值。这里有许多问题讨论如何执行此操作,例如 this one 和 this 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 BYRowId 列就会变成随机数。

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

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

【问题讨论】:

【参考方案1】:

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

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

之后,您使用按列 id 排序的查询

select * from ur_table (query) order by id

【讨论】:

这将是一个快速而肮脏的解决方案,但我认为在大多数情况下不建议以这种方式更改架构。在这种情况下,这不是一个选项,因为 SE 数据浏览器不允许您执行 Alter Table 查询。【参考方案2】:

删除PARTITION BY 正是我们所需要的。您的数字看起来随机的原因是外部查询的ORDER BY 与您的ROW_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

砰,完成!

【讨论】:

完美。这正是我所追求的。看起来子查询也不需要执行,所以我把它删掉了。

以上是关于如何使用 ROW_NUMBER() 在 SELECT 中获取增量“RowId”列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hibernate 中使用 row_number 函数编写查询?

如何使用 ROW_NUMBER()?

如何使用 ROW_NUMBER()?

如何在过程中使用 ROW_NUMBER() 对数据进行分页

如何在 sqlite 中使用 ROW_NUMBER

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