如何找出1对多的条目

时间:2017-08-04 06:45:29

标签: sql vertica

有一个数据集,假设是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

3 个答案:

答案 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