在 SQL 中排名超过 Row_Number
Ranking Over Row_Number in SQL
我在下面发布示例数据。
我有一个行号,它根据日期和名称列生成一个数字(使用 ROW_NUMBER 函数实现)。我现在需要的是另一个名为 Group_Num 的派生列,它为每个组创建一个数字(在本例中为 3)。考虑到我的 Name 列重复但 Date 列值发生变化,这是否可以实现?
提前致谢。
检查这个。
我们可以使用 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
OutPut :
您可以使用 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
我在下面发布示例数据。
我有一个行号,它根据日期和名称列生成一个数字(使用 ROW_NUMBER 函数实现)。我现在需要的是另一个名为 Group_Num 的派生列,它为每个组创建一个数字(在本例中为 3)。考虑到我的 Name 列重复但 Date 列值发生变化,这是否可以实现?
提前致谢。
检查这个。 我们可以使用 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
OutPut :
您可以使用 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