【问题标题】:Ranking Over Row_Number in SQL在 SQL 中对 Row_Number 进行排名
【发布时间】:2017-02-07 06:34:57
【问题描述】:

我在下面发布示例数据。

我拥有的是一个行号,它根据日期和名称列生成一个数字(使用 ROW_NUMBER 函数实现)。我现在需要的是另一个名为 Group_Num 的派生列,它为每个组创建一个数字(在本例中为 3)。考虑到我的 Name 列重复但 Date 列的值发生变化,这可以实现吗?

提前致谢。

【问题讨论】:

标签: sql sql-server tsql ranking-functions


【解决方案1】:

检查这个。 我们可以使用 Row_number() 、lag() 和 SUM() 来实现。

        select 
        Date,
        Name,
        Row_number()over( partition by Group_Num order by ROwiD ) Row_Num,
        Group_Num
        from 
        (
            SELECT * ,  
            SUM(R) OVER(ORDER BY RowID) Group_Num
            FROM
            (
                select *,
                Case When 
                lag(name ) OVER (ORDER BY RowID ) = name
                then 0  else 1 end  as R 
                from 
                    (
                        select DATE,NAME,
                        row_number() OVER (    ORDER BY  (select 1)) AS 'RowID'
                        from #TableName
                    )A
            )B
         )C
        order by ROwiD

输出:

【讨论】:

  • 感谢您的回答。但是如果我使用它,它会将最后 3 行的 Group_Num 返回为“1”。我需要它为 3(即使名称相同)。
【解决方案2】:

您可以使用 DENSE_RANK:

SELECT Date
    , Name
    , ROW_NUMBER() OVER(Partition By Name Order By Name, Date) as Row_Num
    , DENSE_RANK() Over(order by Name) as Group_Num 
FROM #Table

【讨论】:

  • 感谢您的回答。但如果我使用它,它会将最后 3 行的 Group_Num 返回为“1”。我需要它为 3(即使名称相同)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 2011-07-18
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多