【问题标题】:SQL Server Query for Rank (RowNumber) and GroupingsSQL Server 查询排名 (RowNumber) 和分组
【发布时间】:2010-11-11 12:02:55
【问题描述】:

我有一个包含一些列的表:用户、类别、值

我想进行一个查询,该查询将按值对所有用户进行排名,但会针对类别进行重置。

例子:

user1   CategoryA 10
user2   CategoryA 11
user3   CategoryA 9
user4   CategoryB 3
user1   CategoryB 11

查询将返回:

Rank  User   Category  
1     user2   CategoryA
2     user1   CategoryA
3     user3   CategoryA
1     user1   CategoryB
2     user4   CategoryB

有什么想法吗?

我编写查询并指定类别,它可以工作,但是我必须编写循环并且它非常慢。

【问题讨论】:

  • 我当前的查询:SELECT Rank() over (Order by Value, User, Category) as rank, Category, User FROM Table1 Group By User, Category, Value Order by rank asc

标签: sql sql-server tsql group-by rank


【解决方案1】:

在排名函数OVER clause中使用“分区依据”

SELECT
    Rank() over (Partition by Category Order by Value, User, Category) as ranks,
    Category, User
FROM 
    Table1
Group By
    User, Category, Value 
Order by
    ranks asc

【讨论】:

  • 1,261,473 条记录在 33 秒内(我添加了一个未包含在问题中的表连接)。谢谢
  • 要获得与问题输出显示相同的输出排序,按类别排序,排名。此外,User 返回 DB User(即 dbo),并且必须被引用才能到达名为 User 的列。 (引用 [user] 或在“user”上引用标识符。)
  • @Shannon:我从 OP 在评论中添加的查询开始。我只想通过来演示分区
【解决方案2】:
 Select User, Category,
     (Select Count(*) From Table 
      Where Category = A.Category 
         And Value <= A.Value) Rank
 From Table A
 Order By Category, Value

如果 Value 可以有重复项,那么您必须决定是否要“计数”重复项(等同于 RANK)或不(等同于 DENSE_RANK,thanx @shannon)

普通等级:

 Select User, Category,
     (Select 1 + Count(*) From Table -- "1 +" gives 1-based rank, 
      Where Category = A.Category    -- take it out to get 0-based rank
         And Value < A.Value) Rank
 From Table A
 Order By Category, Value 

“密集”等级:

 Select User, Category,
     (Select 1 + Count(Distinct Value) -- "1 +" gives 1-based rank, 
      From Table                       -- take it out to get 0-based rank
      Where Category = A.Category    
         And Value < A.Value) Rank
 From Table A
 Order By Category, Value

【讨论】:

  • 效率很低。他使用 RANK 的事实至少暗示了 SQL 2005。
  • 是的。 SQL 2008。我会尝试所有答案
  • 但是 a) 清晰是第一位的,然后是效率... b) 问题是关于用户的,所以我们不是在谈论数十亿条记录...
  • 不应该是Select User, Category, (Select Count() From Table where Category = A.Category And Value ) From Table where Category = A.Category And Value
  • 我找到了具有排名功能和分区更清晰的解决方案。在平局的情况下,您还可以获得不同的排名,而不是内置的排名功能。例如,值 10、20、20 将导致您的代码为 1、3 3,而对于内置排名,则为 1、2、2。
猜你喜欢
  • 2014-06-14
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
相关资源
最近更新 更多