我有一张人和活动表 - 两列都不是唯一的。 我需要根据不同活动的数量对每个用户进行排名,例如:
_________________
|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。感觉必须有更好的方式。
答案 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