sql >> データベース >  >> RDS >> Oracle

NULL以外の値をパーティション内で上に移動

    投稿した「生」データからサンプルデータを取得することはできません。サブクエリORIGINALDATAのサンプルデータから生データをリバースエンジニアリングし、次のソリューションを考え出しました。

    WITH SAMPLEDATA (CYCLEID,GROUPID,GROUPNAME,COL1,COL2,COL3,COL4,COL5,COL6,COL7)
    AS (
    SELECT 1,7669,'000000261','GAS',NULL,NULL,NULL,'1',NULL,'00' FROM DUAL
    UNION ALL
    SELECT 2,7669,'000000261','GAS',NULL,NULL,NULL,'1',NULL,'000000261' FROM DUAL
    UNION ALL
    SELECT 3,7669,'000000261','GAS',NULL,NULL,NULL,'Chester',NULL,'00' FROM DUAL
    UNION ALL
    SELECT 4,7669,'000000261','GAS',NULL,NULL,NULL,'Chester',NULL,'000000261' FROM DUAL
    UNION ALL
    SELECT 5,7669,'000000261','GFG',NULL,NULL,NULL,'1',NULL,'00' FROM DUAL
    UNION ALL
    SELECT 6,7669,'000000261','GFG',NULL,NULL,NULL,'1',NULL,'000000261' FROM DUAL
    UNION ALL
    SELECT 7,7669,'000000261','GFG',NULL,NULL,NULL,'Chester',NULL,'00' FROM DUAL
    UNION ALL
    SELECT 8,7669,'000000261','GFG',NULL,NULL,NULL,'Chester',NULL,'000000261' FROM DUAL
    UNION ALL
    SELECT 9,7669,'000000261','GKE',NULL,NULL,NULL,'1',NULL,'00' FROM DUAL
    UNION ALL
    SELECT 10,7669,'000000261','GKE',NULL,NULL,NULL,'1',NULL,'000000261' FROM DUAL
    UNION ALL
    SELECT 11,7669,'000000261','GKE',NULL,NULL,NULL,'Chester',NULL,'00' FROM DUAL
    UNION ALL
    SELECT 12,7669,'000000261','GKE',NULL,NULL,NULL,'Chester',NULL,'000000261' FROM DUAL
     ) 
    , originaldata as (
      select distinct groupid, groupname, col, val from sampledata
      unpivot (val for col in (COL1 as 1,COL2 as 2,COL3 as 3,COL4 as 4,COL5 as 5,COL6 as 6,COL7 as 7))
    )
    select GROUPID, GROUPNAME, 
      case when rn = 1 and col1 is null then '*' else col1 end col1,
      case when rn = 1 and col2 is null then '*' else col2 end col2,
      case when rn = 1 and col3 is null then '*' else col3 end col3,
      case when rn = 1 and col4 is null then '*' else col4 end col4,
      case when rn = 1 and col5 is null then '*' else col5 end col5,
      case when rn = 1 and col6 is null then '*' else col6 end col6,
      case when rn = 1 and col7 is null then '*' else col7 end col7
    from (
      select o.*,
      row_number() over(partition by groupid, groupname, col order by val) rn
      from originaldata o
    )
    pivot(
      max(val) 
      for col in (1 as COL1,2 as COL2,3 as COL3,4 as COL4,5 as COL5,6 as COL6,7 as COL7)
    )
    order by groupid, groupname, rn;
    
       GROUPID GROUPNAME COL1      COL2      COL3      COL4      COL5      COL6      COL7     
    ---------- --------- --------- --------- --------- --------- --------- --------- ---------
          7669 000000261 GAS       *         *         *         1         *         00       
          7669 000000261 GFG                                     Chester             000000261
          7669 000000261 GKE                                   
    

    よろしくお願いいたします。StewAshton




    1. 私のSQLで逆順変数を作成する方法

    2. PHPとMySQL関数は、データベースの問題からチェックされていないカテゴリを削除します

    3. Mysql Connector / JがDATEとTIMEのタイムゾーンを変換しないようにするにはどうすればよいですか?

    4. SQLDeveloperでデータをインポートするときにタイムスタンプを読み取る