我有一张人和活动表 - 两列都不是唯一的。我需要根据不同活动的数量对每个用户进行排名,例如:
_________________
|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。感觉必须有更好的方式。
我想你只想要count(distinct)
:
select person, count(distinct activity) as num_activities
from t
group by person
order by num_activities desc;
SELECT Person, COUNT(DISTINCT Activity) AS ActivityCount
FROM MyTable
GROUP BY Person
ORDER BY 2 DESC
您可以使用GROUP BY功能。 SELECT PERSON,COUNT(DISTINCT ACTIVITY)从您的表组中按计数顺序计数;