【问题标题】:SQL Query to add row number that resets everytime the column value changes (SQL Server 2014)SQL Query 添加每次列值更改时重置的行号(SQL Server 2014)
【发布时间】:2020-04-16 00:27:02
【问题描述】:

正在查看 SQL Server 中的 Row_number() 函数以在每次值更改时递增计数器。问题是我需要它在更改时重置,以便相同的值可以在稍后阶段重新出现,并且row_number 仍然重置并在您按日期时间订购时再次从 1 开始,而不是将所有相同类型组合在一起并分配一个行号。

例如:

当我这样做时

select 
    *, 
    row_number() over (partition by type order by datetime) Order 
from 
    TableA;

我得到以下结果(而不是上面显示的所需输出):

【问题讨论】:

  • 请同时提供预期输出
  • 输出添加到 TableA 列行号
  • @Sonu 请不要将输入和输出作为图像提供。
  • 最终结果集中的日期被混淆了,但这看起来像是一个空白和孤岛问题。
  • 这个问题让我失望了,那是什么?

标签: sql sql-server row-number gaps-and-islands


【解决方案1】:

这是Gaps-And-Islands 问题的一种。

您可以通过首先计算列值发生变化的组的排名来解决此问题。

然后在 row_number 中使用该排名。

WITH CTE_DATA AS
(
    SELECT *
    , (ROW_NUMBER() OVER (ORDER BY [datetime]) 
     - ROW_NUMBER() OVER (PARTITION BY [type] ORDER BY [datetime])) AS Rnk
    FROM TableA
)
SELECT [type], [datetime]
, ROW_NUMBER() OVER (PARTITION BY [type], Rnk ORDER BY [datetime]) AS [Order]
FROM CTE_DATA
ORDER BY [datetime]

【讨论】:

    【解决方案2】:
    SELECT [type],[datetime],ROW_NUMBER() OVER (PARTITION BY [Type],A - B ORDER BY A) AS 
    RowNum FROM 
    (
    SELECT *,ROW_NUMBER() OVER ( ORDER BY [datetime] ASC) A 
            ,ROW_NUMBER() OVER (PARTITION BY [TYPE] ORDER BY [datetime] ASC) B  
    FROM #tble1
    )A
    ORDER BY 2
    

    【讨论】:

    • 虽然这个答案可能是正确的。仅代码答案很少有帮助。请评论您的代码并解释此代码如何解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多