1

我正在尝试将一些记录链接在一起以识别兄弟组。我们可以做到这一点的方法是识别具有相同父母的客户。

SQL 示例如下:

SELECT
A.ClientID,
B.ParentID

FROM A
LEFT JOIN B ON B.ClientID to A.ClientID
AND B.REL_END is NULL AND B.REL_CODE = 'PAR'

它将以以下格式返回数据:

     Client ID     Parent ID
     1             A
     1             B
     2             C
     2             D
     3             C
     3             E
     4             C
     4             D

我希望它如何显示如下:

     Client ID    No. of Siblings
     1            0
     2            2
     3            2
     4            2         

希望表格显示孩子 1 有 0 个兄弟姐妹(与 2、3、4 没有父母),孩子 2 有 2 个兄弟姐妹(3 和 4),孩子 3 有 2 个兄弟姐妹(2 和 4),孩子 4 有 2 个兄弟姐妹( 2,3)。看起来它应该很简单来实现这一点,但我现在真的很难想怎么做!我认为这有点令人困惑,因为一个孩子可能只与另一个孩子共享一个父母,以被视为兄弟姐妹。

希望这很清楚,谢谢。

编辑:为了清楚起见,关系是由一个与另一个孩子共享父 ID 的孩子标识的(ID 是唯一的,但我为本示例提供了通用 ID)。因此,孩子 2、3 和 4 都有一个 id 为 C 的父母,他们被视为兄弟姐妹。

4

3 回答 3

2

您可以尝试此查询,它会向我显示所需的输出。

with c_data as (
    select a.clientid, b.parentid, count(a.clientid) over (partition by parentid order by     parentid) as c_parents
    FROM A
      LEFT JOIN B ON (B.ClientID = A.ClientID)
        AND B.REL_END is NULL AND B.REL_CODE = 'PAR'
)
select clientid as "Client ID", max(c_parents) -1 as "No of Siblings"
from c_data
group by clientid;

例子:

SQL> with c_data as (
  2  select a.clientid, b.parentid, count(a.clientid) over (partition by parentid order by parentid) as c_parents
  3  FROM A
  4  LEFT JOIN B ON (B.ClientID = A.ClientID)
  5  AND B.REL_END is NULL AND B.REL_CODE = 'PAR'
  6  )
  7  select clientid as "Client ID", max(c_parents) -1 as "No of Siblings"
  8  from c_data
  9  group by clientid;

 Client ID No of Siblings
---------- --------------
         1              0
         2              2
         4              2
         3              2

Transcurrido: 00:00:00.03
SQL>

使用分析函数,我们计算由当前元组相关的 parentid 分区的所有客户端 ID,以计算具有相同父级的所有客户端。

在投影之后,我们得到每个客户端共有的最大父节点数,并减去 1,即客户端本身。

希望这可以帮助!

问候!

于 2012-07-05T15:36:04.940 回答
1

这是相当复杂的。如果您可以假设每个孩子恰好有两个父母,那么您可以执行以下操作:

select c.*, count(*) over (partition by min_parent, max_parent) - 1 as NumSiblings
from (SELECT A.ClientID, min(B.ParentID) as min_parent, max(b.parentid) as max_parent
      FROM A LEFT JOIN
           B
           ON B.ClientID to A.ClientID AND B.REL_END is NULL AND B.REL_CODE = 'PAR'
      group by a.clientid
     ) c

这样做是计算每个客户的两个父母。然后它使用 windows 函数来计算具有完全相同父级的客户端的数量。“-1”是因为所有的孩子都被计算在内,我们不想计算当前的孩子。

如果你可以有两个以上的父母,那么查询就更复杂了。

如果您只想共享一个父母(而不是两个),那么您可以使用自联接来处理:

with cp as (SELECT A.ClientID, B.ParentID
            FROM A LEFT JOIN
                 B
                 ON B.ClientID to A.ClientID AND B.REL_END is NULL AND B.REL_CODE = 'PAR'
           )
select cp.client_id, count(distinct cp1.client_id) as NumSiblings
from cp left outer join
     cp cp1
     on cp.parent_id = cp1.parent_id and cp.client_id <> cp1.client_id
group by cp.client_id
于 2012-07-05T15:27:56.633 回答
0

好吧,我不明白表格和关系是如何制作的,但你可以这样做:

SELECT ClientID, sum(NumberOfSibling) as NumberOfSibling
from(
    SELECT A.ClientID, (select count(ClientID) 
                        from A2
                        LEFT JOIN B2 ON B2.ClientID to A2.ClientID
                        AND B2.REL_END is NULL AND B2.REL_CODE = 'PAR'
                        where B2.ParentID = B.ParentID) as NumberOfSibling
    FROM A
    LEFT JOIN B ON B.ClientID to A.ClientID
    AND B.REL_END is NULL AND B.REL_CODE = 'PAR'
) GROUP BY ClientID

说明:我接受了您的请求并修改了第二个结果以返回拥有相同父级的兄弟姐妹的总和(也就是说the select count(*) ...,这也是我不确定条件的部分)。并将其放在另一个中,按 ClientID 分组,以获得 2 个父母的总和。

于 2012-07-05T14:55:15.860 回答