我试着运行下面的查询,我想让列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;
看起来你想要的是简单的字符串聚合,并对有多于一条记录的组进行过滤。
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
你很可能只想对以下数据进行分组 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
使用上面提出的分析函数。