Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server查询排名(行数)和分组_Sql_Sql Server_Tsql_Group By_Rank - Fatal编程技术网

SQL Server查询排名(行数)和分组

SQL Server查询排名(行数)和分组,sql,sql-server,tsql,group-by,rank,Sql,Sql Server,Tsql,Group By,Rank,我有一个表,它有一些列:User、Category、Value 我想做一个查询,根据值对所有用户进行排名,但对类别进行重置 例如: 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

我有一个表,它有一些列:User、Category、Value

我想做一个查询,根据值对所有用户进行排名,但对类别进行重置

例如:

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 User, Category,
     (Select Count(*) From Table 
      Where Category = A.Category 
         And Value <= A.Value) Rank
 From Table A
 Order By Category, Value
如果值可以有重复项,那么您必须决定是否要“计数”与秩相等的重复项,或者不等于稠密秩,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

在排名函数中使用分区


我当前的查询:从表1中选择按值排序的排名、用户、类别为排名、类别、用户按用户分组、类别、值按排名排序是非常低效的。事实上,他使用的是RANK,这至少意味着SQL 2005.True。SQL 2008。我会尝试所有答案,但首先是清晰,然后是效率。。。b的问题是关于用户的,所以我们不是在讨论数十亿条记录……它不应该是从表中选择用户、类别、选择计数,其中类别=A。类别和值我用秩函数和更清晰的分区找到解决方案。与内置的秩函数相比,在连接的情况下,也会得到不同的秩。例如,如果值为10、20、20,则代码的结果为1、3,而内置秩的结果为1、2、2。1261473条记录在33秒内完成,我添加了一个表联接,但问题中没有包含该联接。感谢您获得与问题输出相同的输出顺序,按类别、等级排序。此外,User返回DB User,即dbo,并且必须被引用才能到达名为User的列。引用了[user]或在user上引用了标识符。@Shannon:我从OP在注释中添加的查询开始。我只想通过
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