我有一个表,其值如下:
|---------------------|------------------|
| USER | ITEM |
|---------------------|------------------|
| Abel | 1 |
|---------------------|------------------|
| Abel | 2 |
|---------------------|------------------|
| Bart | 1 |
|---------------------|------------------|
| Bart | 2 |
|---------------------|------------------|
| Curt | 3 |
|---------------------|------------------|
| Curt | 4 |
|---------------------|------------------|
| Dawn | 5 |
|---------------------|------------------|
| Emma | 5 |
|---------------------|------------------|
| Emma | 6 |
|---------------------|------------------|
| Emma | 7 |
|---------------------|------------------|
| Fina | 6 |
|---------------------|------------------|
从该表中,我只想选择不遵循的表:
用户自己只能拥有一项。
用户只有与另一个用户拥有一个项目时,才能拥有多个项目。
一组用户只能有一个共同的ITEM。
随后:
SQL是否可能实现此功能,或者我需要用另一种语言编写脚本?
至少我需要知道不正常的用户数
最佳情况,一个表,其中包含错误
的项目答案 0 :(得分:0)
对于具有多个项目的用户,您可以使用窗口功能:
select user
from (select t.*, count(*) over (partition by item) as item_cnt
from t
) t
where item_cnt = 1
group by user
having count(*) >= 2;
对于与另一用户共享一个以上项目的用户,可以使用自动加入:
select distinct t1.user
from t t1 join
t t2
on t1.item = t2.item and t1.user <> t2.user
group by t1.user, t2.user
having count(*) > 1;
最终的解决方案是这两个查询中的union
。