繁体   English   中英

查询以查找帐户 sql 的组合

[英]Query to find combinations of accounts sql

我正在寻找如何形成查询,我试图发现订购账户与相同的受益人账户交互 3 次或更多次。 正如我在下面描述的。
示例:账户A发送账户 1,2 和 3。账户B发送账户 1,2 和 3。账户C发送账户 1,2 和 3。

这是名为 TBL_ACCOUNTS 的表

订购账户 受益人帐户
一个 1
1
C 1
一个 2
2
C 2
一个 3
3
C 3
H 1
ķ 23
Z 329
W 3

我想找到所有满足此条件的帐户,即订购帐户与相同的受益人帐户交互 3 次或更多次。 你期望得到的结果是。

订购账户 受益人帐户
一个 1
一个 2
一个 3
1
2
3
C 1
C 2
C 3

我希望你能指导我走哪条路,因为我有点迷路了。

您可以创建一个集合数据类型:

CREATE TYPE int_list IS TABLE OF INT;

然后你可以使用:

WITH accounts (ordering_account, beneficiary_account, accounts) AS (
  SELECT t.*,
         CAST(
           COLLECT(beneficiary_account) OVER (PARTITION BY ordering_account)
           AS int_list
         )
  FROM   TBL_ACCOUNTS t
)
SELECT ordering_account,
       beneficiary_account
FROM   accounts a
WHERE  EXISTS(
         SELECT 1
         FROM   accounts x
         WHERE  a.ordering_account <> x.ordering_account
         AND    CARDINALITY(a.accounts MULTISET INTERSECT x.accounts) >= 3
         -- Remove the next line if you want to return all accounts and not just the matched accounts
         AND    a.beneficiary_account = x.beneficiary_account
       );

其中,对于样本数据:

CREATE TABLE TBL_ACCOUNTS (ordering_account, beneficiary_account) AS
SELECT 'A',   1 FROM DUAL UNION ALL
SELECT 'B',   1 FROM DUAL UNION ALL 
SELECT 'C',   1 FROM DUAL UNION ALL
SELECT 'A',   2 FROM DUAL UNION ALL
SELECT 'B',   2 FROM DUAL UNION ALL
SELECT 'C',   2 FROM DUAL UNION ALL
SELECT 'A',   3 FROM DUAL UNION ALL
SELECT 'B',   3 FROM DUAL UNION ALL
SELECT 'C',   3 FROM DUAL UNION ALL
SELECT 'C',   4 FROM DUAL UNION ALL
SELECT 'H',   1 FROM DUAL UNION ALL
SELECT 'K',  23 FROM DUAL UNION ALL
SELECT 'Z', 329 FROM DUAL UNION ALL
SELECT 'W',   3 FROM DUAL;

输出:

ORDERING_ACCOUNT 受益人帐户
一个 1
一个 3
一个 2
1
3
2
C 1
C 2
C 3

如果你想在没有集合的情况下这样做:

SELECT ordering_account,
       beneficiary_account
FROM   TBL_ACCOUNTS a
WHERE  EXISTS(
         SELECT 1
         FROM   TBL_ACCOUNTS x
         WHERE  a.ordering_account <> x.ordering_account
         AND    a.beneficiary_account = x.beneficiary_account
         AND    EXISTS(
                  SELECT 1
                  FROM   TBL_ACCOUNTS l
                         INNER JOIN TBL_ACCOUNTS r
                         ON (l.beneficiary_account = r.beneficiary_account)
                  WHERE  l.ordering_account = a.ordering_account
                  AND    r.ordering_account = x.ordering_account
                  HAVING COUNT(*) >= 3
                )
       );

或者:

SELECT ordering_account,
       beneficiary_account
FROM   TBL_ACCOUNTS a
WHERE  EXISTS(
         SELECT 1
         FROM   TBL_ACCOUNTS l
                INNER JOIN TBL_ACCOUNTS r
                ON (   l.beneficiary_account = r.beneficiary_account
                   AND l.ordering_account <> r.ordering_account )
         WHERE  l.ordering_account = a.ordering_account
         GROUP BY r.ordering_account
         HAVING COUNT(*) >= 3
         AND    COUNT(
                  CASE WHEN r.beneficiary_account = a.beneficiary_account THEN 1 END
                ) > 0
       );

db<> 在这里摆弄

也许是这样的:

select ordering_account, beneficiary
from TBL_ACCOUNTS 
group by ordering_account, beneficiary
having count(*) >= 3
order by ordering_account, beneficiary
SELECT T.ordering_account,T.beneficiary_account 
FROM TBL_ACCOUNTS T
JOIN
(
   SELECT Z.ordering_account
   FROM TBL_ACCOUNTS Z
   GROUP BY Z.ordering_account
   HAVING COUNT(*)>2
)X ON T.ordering_account=X.ordering_account
ORDER BY T.ordering_account,T.beneficiary_account

或者

SELECT X.ordering_account,X.beneficiary_account FROM
(
  SELECT T.ordering_account,T.beneficiary_account,
   COUNT(*)OVER(PARTITION BY  T.ordering_account)XCOL
   FROM TBL_ACCOUNTS T
)X WHERE X.XCOL=3
ORDER BY X.ordering_account,X.beneficiary_account

自加入受益人帐户上的表。 因此,您获得所有订购账户对的频率与它们共享 share3 受益账户的频率一样。 这意味着您可以按这些对分组并计数。

以下查询列出了所有订单账户的所有条目,其中存在另一个共享至少三个受益人账户的订单账户。

with share3 as
(
  select a1.ordering_account as acc1, a2.ordering_account as acc2
  from tbl_accounts a1
  join tbl_accounts a2 on a2.beneficiary_account = a1.beneficiary_account
                       and a2.ordering_account > a1.ordering_account
  group by a1.ordering_account, a2.ordering_account
  having count(*) >= 3
)
select *
from tbl_accounts
where exists
(
  select null
  from share3
  where share3.acc1 = tbl_accounts.ordering_account
     or share3.acc2 = tbl_accounts.ordering_account
)
order by ordering_account, beneficiary_account;

我不确定我是否遵循您的要求,但听起来您只需要包含一个 ORDER BY 子句。

在您的查询结束时只包括

ORDER BY 'ordering account', 'beneficiary account'

唯一可以改变这一点的是,如果您使用不喜欢单引号的不同类型的 SQL。 您可能需要使用 [],"" 或 ``。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM