除了嵌套的 GROUP BY,还有其他选择吗?
Is there an alternative to doing nested GROUP BYs?
我正在尝试查找分配给多个位置的 ID。注意 26 和 28 的 ID 有多个记录,但具有相同的 loc
所以我不希望它们出现在结果集中。数据可能如下所示:
Id | loc
-------
23 | A
23 | B
24 | A
25 | A
26 | A
26 | A
27 | A
27 | B
28 | B
28 | B
29 | A
29 | B
我目前正在做的是:
Select id
FROM (
Select id, loc, count(*)
from tbl
GROUP BY id, loc
HAVING COUNT(*)>1
) grped
GROUP BY id
HAVING COUNT(*)>1
我正在尝试 return 这些 ID:
Id
--
23
27
29
这实现了 "I'm trying to find IDs that are assigned to multiple locations."
的目标
一个简单的方法使用一个 group by
:
select id
from tbl
group by id
having min(loc) <> max(loc);
注意:这与您的逻辑略有不同,因为它忽略了 NULL
值,而您的版本将 NULL
位置视为另一个值。可以修改以上内容以考虑到这一点:
select id
from tbl
group by id
having (min(loc) <> max(loc)) or
(min(loc) is not null and count(loc) <> count(*))
您正在寻找具有多个位置的 ID:
select id
from tbl
group by id
having count(distinct loc) > 1;
我正在尝试查找分配给多个位置的 ID。注意 26 和 28 的 ID 有多个记录,但具有相同的 loc
所以我不希望它们出现在结果集中。数据可能如下所示:
Id | loc
-------
23 | A
23 | B
24 | A
25 | A
26 | A
26 | A
27 | A
27 | B
28 | B
28 | B
29 | A
29 | B
我目前正在做的是:
Select id
FROM (
Select id, loc, count(*)
from tbl
GROUP BY id, loc
HAVING COUNT(*)>1
) grped
GROUP BY id
HAVING COUNT(*)>1
我正在尝试 return 这些 ID:
Id
--
23
27
29
这实现了 "I'm trying to find IDs that are assigned to multiple locations."
的目标一个简单的方法使用一个 group by
:
select id
from tbl
group by id
having min(loc) <> max(loc);
注意:这与您的逻辑略有不同,因为它忽略了 NULL
值,而您的版本将 NULL
位置视为另一个值。可以修改以上内容以考虑到这一点:
select id
from tbl
group by id
having (min(loc) <> max(loc)) or
(min(loc) is not null and count(loc) <> count(*))
您正在寻找具有多个位置的 ID:
select id
from tbl
group by id
having count(distinct loc) > 1;