qq_41586501 2021-06-11 10:29 采纳率: 0%
浏览 32

寻求利用SQL对数据进行分组的帮助

寻求利用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。。。。。。。。。

  • 写回答

2条回答 默认 最新

  • CSDN专家-文盲老顾 2021-06-11 11:14
    关注

    这个用简单的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
    

    这个例子不是很完美,有可能出现截图的第三个情况,部分数据没有匹配到其他信息,而产生丢失,你需要自行调整后续

    评论

报告相同问题?

悬赏问题

  • ¥15 Workbench中材料库无法更新,如何解决?
  • ¥20 如何推断此服务器配置
  • ¥15 关于github的项目怎么在pycharm上面运行
  • ¥15 内存地址视频流转RTMP
  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败