我使用了有计数的Joins同表(自连接)。但结果并不像预期的那样。我使用的是Oracle数据库

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

我试着运行下面的查询,我想让列rp_num中的所有数据都在列rp_num_group中。我希望列rp_num中的所有数据都在列rp_num_group中。我还希望列rp_num中所有计数超过1的数据(在std_id, rp_fam, rn, rp_id中超过一个计数)都在列std_id_group中。但是在我的查询中,我得到的数据是在列rp_num_group和std_id_group中都有大于1的计数。请建议正确使用连接的方法来获得正确的结果。

例如,如果我的表是像下面这样的。

std_id      rn      rp_id       rp_fam      rp_num

1234        1234    1           abc         a12
1234        1235    1           abc         a34
1234        1236    1           xyz         a56
1244        1246    2           xyz         234
1244        1245    2           hgf         z65
1254        1456    2           hgf         z78

我希望我的结果是:

std_id      rp_num_group        std_id_group
1234        a12 a34 a56          a12:abc  a34:abc
1244        234 265 z78          z65:hgf  z78:hgf

但是我的结果是这样的

std_id      rp_num_group        std_id_group
1234        a12 a34            a12:abc  a34:abc
1244        z65 z78            z65:hgf  z78:hgf
     SELECT DISTINCT rrpn.std_id,  
                          Stringagg(rrpn.rp_num) 
                          over ( 
                            PARTITION BY tmta.rp_id,tmta.rn,tmta.std_id
                            ORDER BY Nlssort(tmta.mta, 'NLS_SORT=BINARY_CI') ROWS 
                          BETWEEN unbounded 
                          preceding AND unbounded following ) AS rp_num_group,
                            Stringagg_distinct(rrpn3.rp_num||':'||rrpn3.rp_fam ) 
                          over ( 
                            PARTITION BY rrpn3.std_id, rrpn3.rn, rrpn3.rp_id 
                            ORDER BY Nlssort(rrpn3.rp_num, 'NLS_SORT=BINARY_CI') ROWS 
                          BETWEEN unbounded 
                          preceding AND unbounded following ) AS std_id_group
        FROM   data_rrpn rrpn 
                join data_rrpn rrpn3
                  ON rrpn3.std_id = rrpn.std_id 
                AND rrpn3.rp_fam = rrpn.rp_fam 
                AND rrpn3.rn = rrpn.rn 
                AND rrpn3.rp_id = rrpn.rp_id 
               join (SELECT std_id, 
                            rp_fam, 
                            rn, 
                            rp_id, 
                            Count(*) 
                     FROM   data_rrpn 
                     GROUP  BY std_id, 
                               rp_fam, 
                               rn, 
                               rp_id 
                     HAVING Count(*) > 1) rrpn2 
                 ON rrpn3.std_id = rrpn2.std_id 
                    AND rrpn3.rp_fam = rrpn2.rp_fam 
                    AND rrpn3.rn = rrpn2.rn 
                    AND rrpn3.rp_id = rrpn2.rp_id 
        ORDER  BY rrpn.std_id; 
sql string oracle group-by having
1个回答
0
投票

看起来你想要的是简单的字符串聚合,并对有多于一条记录的组进行过滤。

select 
    std_id,
    listagg(rp_num, ' ') within group(order by rp_num) rp_num_group,
    listagg(rp_num || ':' || rp_fam, ' ') within group(order by rp_num) std_id_group
from data_rrpn 
group by std_id
having count(*) > 1

0
投票

你很可能只想对以下数据进行分组 std_id, rp_fam, rp_id不在 RN (这是唯一的?)。

在这里,你会得到一个预览 rp_num将被认为是(GRP_CNT > 1):

select a.*,
count(*) over (partition by std_id, rp_fam, rp_id) grp_cnt
from tst a;

    STD_ID         RN      RP_ID RP_FA RP_NU    GRP_CNT
---------- ---------- ---------- ----- ----- ----------
      1234       1234          1 abc   a12            2
      1234       1235          1 abc   a34            2
      1234       1236          1 xyz   a56            1
      1244       1245          2 hgf   z65            1
      1244       1246          2 xyz   234            1
      1254       1456          2 hgf   z78            1

最后的查询将是

with grp as
(
select a.*,
count(*) over (partition by std_id, rp_fam, rp_id) grp_cnt
from tst a
)
select STD_ID,
  listagg(RP_NUM, ' ') within group(order by RP_NUM) rp_num_group,
  listagg(case when grp_cnt > 1 then RP_NUM || ':' || RP_FAM end, ' ') within group(order by RP_NUM) std_id_group
from grp
group by STD_ID;

给出结果。

STD_ID, RP_NUM_GROUP, STD_ID_GROUP
1234    a12 a34 a56   a12:abc a34:abc
1244    234 z65 
1254    z78 

不知道你是怎么得到的 z65:hgf z78:hgf在你的样本结果中,但我认为如果有一些额外的 魔理你只需要调整计算的 GRP_CNT 使用上面提出的分析函数。

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