有一个数据集,假设是1对1映射。 例如,
userId, deviceId
aaa, 12345
bbb, 22398
ccc, 43284
但是,有一种设备ID有多个userId。
userId, deviceId
ddd, 12094
eee, 12094
fff, 12094
ggg, 459834
hhh, 459834
iii, 459834
jjj, 459834
哪些SQL只能列出这些一对多条目? 想象一下,有很多一对多的条目。我不需要在结果中输入一对一的条目。所以,我希望看到的结果是,
deviceId, _cnt
12094, 3
459834, 4
答案 0 :(得分:1)
最好使用列名而不是count(*)。在大数据集的情况下,它也会提高性能。
SELECT deviceId,
COUNT(userId) AS user_count
FROM table
GROUP BY deviceId
HAVING COUNT(userId)> 1
答案 1 :(得分:1)
一个简单的计数:
select deviceId, count(*) _cnt
from mytable
group by 1
having count(*) > 1
列出非1-1的所有条目:
select userId, deviceId
from mytable
where deviceId in (
select deviceId
from mytable
group by 1
having count(*) > 1
)
或者
select distinct a.userId, b.deviceId
from mytable a
join mytable b on b.deviceId = a.deviceId
and b.userId != a.deviceId
答案 2 :(得分:0)
您好,您可以COUNT然后过滤COUNT大于1的那些:
SELECT deviceId
, COUNT(DISTINCT userId) AS uct
, COUNT(userId) AS ct
FROM table
GROUP BY deviceId
HAVING ct > 1
AND uct > 1