zoukankan      html  css  js  c++  java
  • oracle多行合并一行,且需排序

    View Code
    SELECT lotid,
             
    ltrim(MAX(sys_connect_by_path(wf_lotno, ',')), ',') wf_lotno,
             
    ltrim(MAX(sys_connect_by_path(wf_jobno, ',')), ',') wf_jobno,
             
    ltrim(MAX(sys_connect_by_path(wf_partno, ',')), ',') wf_partno,
             
    ltrim(MAX(sys_connect_by_path(supplier, ',')), ',') supplier,
             
    ltrim(MAX(sys_connect_by_path(wf_id, ',')), ',') wf_id
      
    FROM (SELECT lotid,
                        wf_lotno,
                        wf_jobno,
                        wf_partno,
                        supplier,
                        wf_id,
                        
    MIN(wf_id) over(PARTITION BY lotid) wf_id_min,
                        (row_number() 
    over(ORDER BY lotid, wf_id)) +
                        (dense_rank() 
    over(ORDER BY lotid)) wf_id_count
                 
    FROM (SELECT lotid,
                                  wf_lotno,
                                  wf_jobno,
                                  wf_partno,
                                  supplier,
                                  to_string(
    CAST(COLLECT(wf_id) AS varchar2_ntt)) AS wf_id
                            
    FROM dio_yld_wf_inf_w
                          
    WHERE lotid = 'B737756.D1'
                          
    GROUP BY lotid,
                                      wf_lotno,
                                      wf_jobno,
                                      wf_partno,
                                      supplier))
     START 
    WITH wf_id = wf_id_min
    CONNECT 
    BY wf_id_count - 1 = PRIOR wf_id_count
     
    GROUP BY lotid;

    第一层:相同wf_lot先合并一次。

    比如

    lotid   wf_lot  wf_id

    10     a          5

    10     a          6

    10     b          7

    11     a          8

    11     b          9

    12     a          10

    第一层结果为

    10     a          5 / 6

    10     b          7

    11     a          8

    11     b          9

    12     a          10 

    希望达到的最终效果:

    10     a,b          5 / 6,7

    11     a,b          8,9

    12     a          10 

    注意: 10这一行不能是:

    10     a,b    7,5 / 6 

    10     b,a    5 / 6, 7 

    要按顺序排列。

    暂时看这个方法的效率不是很好。


     后面改进了一下:

    SELECT lotid,
             
    MAX(wf_lotno) wf_lotno,
             
    MAX(wf_jobno) wf_jobno,
             
    MAX(wf_partno) wf_partno,
             
    MAX(supplier) supplier,
             
    MAX(wf_id) wf_id
      
    FROM (SELECT t.lotid,
                        wmsys.wm_concat(t.wf_lotno) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno) wf_lotno,
                        wmsys.wm_concat(t.wf_jobno) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_jobno) wf_jobno,
                        wmsys.wm_concat(t.wf_partno) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno, t.wf_jobno) wf_partno,
                        wmsys.wm_concat(t.supplier) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno, t.supplier) supplier,
                        wmsys.wm_concat(t.wf_id) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno, t.wf_id) wf_id
                 
    FROM (SELECT lotid,
                                  wf_lotno,
                                  wf_jobno,
                                  wf_partno,
                                  supplier,
                                  to_string(
    CAST(COLLECT(wf_id) AS varchar2_ntt)) AS wf_id
                            
    FROM dio_yld_wf_inf_w
                         
    /*WHERE lotid = 'B737756.D1'*/
                          
    GROUP BY lotid,
                                      wf_lotno,
                                      wf_jobno,
                                      wf_partno,
                                      supplier) t)
     
    GROUP BY lotid;

    继续改进:

    SELECT lotid,
             
    MAX(wf_lotno) wf_lotno,
             
    MAX(wf_jobno) wf_jobno,
             
    MAX(wf_partno) wf_partno,
             
    MAX(supplier) supplier,
             
    MAX(wf_id) wf_id
      
    FROM (SELECT t.lotid,
                        wmsys.wm_concat(t.wf_lotno) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno) wf_lotno,
                        wmsys.wm_concat(t.wf_jobno) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_jobno) wf_jobno,
                        wmsys.wm_concat(t.wf_partno) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno, t.wf_jobno) wf_partno,
                        wmsys.wm_concat(t.supplier) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno, t.supplier) supplier,
                        wmsys.wm_concat(t.wf_id) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno, t.wf_id) wf_id
                 
    FROM (SELECT lotid,
                                  wf_lotno,
                                  wf_jobno,
                                  wf_partno,
                                  supplier,
                                  to_string(
    CAST(COLLECT(wf_id) AS varchar2_ntt)) AS wf_id
                            
    FROM dio_yld_wf_inf_w
                         
    /*WHERE lotid = 'B737756.D1'*/
                          
    GROUP BY lotid,
                                      wf_lotno,
                                      wf_jobno,
                                      wf_partno,
                                      supplier) t)
     
    GROUP BY lotid;

    最后由原来20s降低到4s。 

             

                成长

           /      |     \

        学习   总结   分享

    QQ交流群:122230156

  • 相关阅读:
    iOS之使用AFN进行序列化处理(5)
    iOS之AFN文件上传(4)
    iOS之AFN使用技巧(3)
    iOS之AFN框架基本使用(2)
    iOS之AFN简介(1)
    iOS之JSON解析和视频的简单播放
    iOS之带有边框的圆形图片裁剪
    SQL limit offset
    Ubuntu安装pycharm, No JDK found. Please validate either PYCHARM_JDK, JDK_HOME or JAVA_HOME environment variable points to valid JDK installation
    scrapy项目运行报错: exceptions.ImportError: No module named win32api
  • 原文地址:https://www.cnblogs.com/benio/p/2130699.html
Copyright © 2011-2022 走看看