查询统计和过滤记录

问题描述 投票:0回答:2

这是我的数据:

账户 合作伙伴 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

想知道获得结果的有效方法。

group-by unique teradata window-functions analytical
2个回答
0
投票

您可以使用 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;

演示。


0
投票

您可以使用 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

© www.soinside.com 2019 - 2024. All rights reserved.