选择并计算非唯一列的属性

时间:2018-03-02 11:48:52

标签: sql sql-server

我有一张人和活动表 - 两列都不是唯一的。 我需要根据不同活动的数量对每个用户进行排名,例如:

_________________ 
|PERSON|ACTIVITY|
-----------------
|Lars  | Sleep  |
|James | Eat    |
|Lars  | Sleep  | 
|Lars  | Sleep  | 
|Kirk  | Shred  |
|James | Shred  |
-----------------

Lars出现三次,但反复执行相同的活动。 柯克出现过一次,所以他在活动数量方面与拉尔斯相同。 詹姆斯执行两项不同的活动,因此他应该排名最高。

预期产出:

James - 2
Kirk - 1 
Lars - 1

(相同计数的排序无关紧要)

我提出的解决方案涉及将DISTINCT应用于person列并迭代名称,为每个名称选择活动并应用DISTINCT后跟COUNT。感觉必须有更好的方式。

3 个答案:

答案 0 :(得分:2)

我想你只想要count(distinct)

select person, count(distinct activity) as num_activities
from t
group by person
order by num_activities desc;

答案 1 :(得分:0)

您可以使用GROUP BY功能。 SELECT PERSON,COUNT(DISTINCT ACTIVITY)作为您的表组中的人数按人数排序;

答案 2 :(得分:0)

SELECT Person, COUNT(DISTINCT Activity) AS ActivityCount
FROM MyTable
GROUP BY Person
ORDER BY 2 DESC