这是我的数据:
账户 | 合作伙伴 | ADDRS_NUM |
---|---|---|
HL124 | 2341 | ASD123 |
HL124 | 2341 | SDF234 |
HL124 | 234N | SDF234 |
HG225 | 45BV | QWE345 |
HG225 | 72AA | QWE345 |
UY150 | 8846 | CCC204 |
需要得到
ACCOUNT
有多个PARTNER & ADDRS_NUM不一样
在上面的例子中,我们只需要得到HL124
我尝试了 select query,然后考虑过滤计数,但是 select 给出了奇怪的 o/p 并且还需要时间。
SELECT
COUNT(ACCOUNT) OVER (PARTITION BY ACCOUNT),
COUNT(PARTNER) OVER (PARTITION BY ACCOUNT),
COUNT(ADDRS_NUM) OVER (PARTITION BY ACCOUNT)
FROM
table
想知道获得结果的有效方法。
您可以使用 1 个窗口函数用于帐户,另一个用于过滤 PARTNER & ADDRS_NUM 多个值 -
SELECT ACCOUNT
FROM (SELECT ACCOUNT, PARTNER, ADDRS_NUM,
COUNT(*) OVER(PARTITION BY ACCOUNT) RN1,
COUNT(*) OVER(PARTITION BY ACCOUNT, PARTNER ) RN2,
COUNT(*) OVER(PARTITION BY ACCOUNT, ADDRS_NUM) RN3
FROM DATA
)
WHERE RN1 > 1
AND RN2 > 1
AND RN3 > 1;
您可以使用 COUNT(DISTINCT ...) 如下:
SELECT
ACCOUNT
FROM MyData
GROUP BY ACCOUNT
HAVING
count(distinct PARTNER)>0
OR
count(distinct ADDRS_NUM)>0
如果帐户有多个合作伙伴或多个地址的合作伙伴,这将为每个帐户提供一行。要获取这些行的详细信息,您可以按如下方式组合:
select *
from MyData
where ACCOUNT IN
(SELECT
ACCOUNT
FROM MyData
GROUP BY ACCOUNT
HAVING
count(distinct PARTNER)>0
OR
count(distinct ADDRS_NUM)>0
)
如果有数千个这样的情况,您可能会考虑更改
IN' query to an
EXISTS, or
INNER JOIN` 并观察性能变化。
要将第一个查询更改为“如果帐户有多个合作伙伴并且他们位于不同的地址,则每个帐户一行”,您可以将
OR
更改为AND
。