寻求利用SQL对数据进行分组的帮助,请各位大神出手相助,万分谢谢。
具体内容如下:
Oracle表A
ID SJ SJID XJ XJID
1 南京市 6100 玄武区 6100100
2 南京市 6100 秦淮区 6100200
3 南京市 6100 鼓楼区 6100300
4 无锡市 6200 锡山区 6200100
5 无锡市 6200 梁溪区 6200200
6 无锡市 6200 惠山区 6200300
7 徐州市 6300 云龙区 6300100
8 徐州市 6300 泉山区 6300200
9 。。。。。。。。。。。。。
10。。。。。。。。。。。。。
我想对其进行随机分组,每次都是不一样的、随机的配对。相当于生成一张对应表用于不同区(XJ)之间进行相互监督,
要求:
1、同一市(SJ)内区(XJ)之间不能相互监督(不能出现南京市的A监督南京市的B);
2、区(XJ)之间不能相互监督自己(即:不能出现A监督B,同时B又监督A);
3、区(XJ)自己不能监督自己(不能出现A监督A)。
要生成类似下面这种形式的对应关系表:
ID SJ SJID XJ XJID BJDSJ BJDSJID BJDXJ BJDXJID
1 南京市 6100 玄武区 6100100 无锡市 6200 梁溪区 6200200
2 徐州市 6300 云龙区 6300100 南京市 6100 鼓楼区 6100300
3 无锡市 6200 梁溪区 6200200 南京市 6100 秦淮区 6100200
4 无锡市 6200 惠山区 6200300 南京市 6100 玄武区 6100100
5 。。。。。。。。
6。。。。。。。。。
这个用简单的sql指令够呛能完成,用存储过程搞吧,用mssql给你做个例子参考
with t(id,sj,xj) as (
select 1,'A','a'
union all select 2,'A','b'
union all select 3,'A','c'
union all select 4,'B','a'
union all select 5,'B','b'
union all select 6,'B','c'
union all select 7,'C','a'
union all select 8,'C','b'
union all select 9,'C','c'
union all select 10,'C','d'
),t1 as (
-- 将原始数据进行关联,且城市不能一致,则直接完成要求的1、2、3
select a.*,b.sj as bsj,b.xj as bxj
-- 追加一个序列字段,用来作为临时表的id,oracle中自行替换为相关函数
,ROW_NUMBER() over(order by @@rowcount) as rid
from t a
left join t b on a.sj<>b.sj
)
-- 将关联后的数据保存至临时表,追加一个rid,作为删除临时表数据的依据
select *
into #t
from t1
-- 建立一个空临时表,结构与临时表#t一致,用以存放最终数据
select *
into #t1
from #t
where id=0
-- 当临时表中有数据,则想新临时表#t1插入数据
while (select COUNT(0) from #t)>0
begin
insert into #t1
select top 1 *
from #t a
-- mssql按newid()排序可以认为是随机排序,oracle中自行替换
order by NEWID()
-- 插入数据后,将临时表#t中,所有关联数据删除,即,城市、区一致的监督方,城市、区一致的被监督方
delete from #t
where rid in (
select rid from #t a
where exists(
select top 1 1
from #t1
where sj=a.sj and xj=a.xj
)
or exists(
select top 1 1
from #t1
where bsj=a.bsj and bxj=a.bxj
)
)
end
-- 最终输出结果
select * from #t1 order by id
drop table #t1
drop table #t
这个例子不是很完美,有可能出现截图的第三个情况,部分数据没有匹配到其他信息,而产生丢失,你需要自行调整后续
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632