數據庫groub by分組后,把多行數據合並成一行數據(Oracle、Postgres)


  • 關鍵字 row_number() over (partition by)

   例如,下面的數據, 這是按照name分組后,展示property值。

        

  我們想得到這樣的值;

  

  

  1.   第一步:將每一組的property標上序號
  select name,property,row_number() over (partition by name order by property desc) column_num from test

  得到的結果:

  

  partition by 后面接的就應該是將要分組的字段。如果partition by property 相當於按照property分組,那么后面的列序號column_num就是1,1,1,1,1,1,1。

  2.   第二步:按name分組后按照max或min合在一條數據中:

SELECT   NAME, MAX (DECODE (column_num, 1, property)) val1,

         MAX (DECODE (column_num, 2, property)) val2,

         MAX (DECODE (column_num, 3, property)) val3,

         MAX (DECODE (column_num, 4, property)) val4

    FROM (SELECT NAME, property, ROW_NUMBER () OVER (PARTITION BY NAME ORDER BY property DESC) column_num FROM test)

GROUP BY NAME 

  

  這樣就得到了結果,如下圖:

  

  

  數據就合成功了:電腦(電源、硬盤、顯示器、cpu)

                                   相機(三腳架、記憶卡、鏡頭)

     分析一下,row_number()其實就是給每條記錄返回一個數字,序號是從1開始。比如:

  SELECT NAME, property, ROW_NUMBER () OVER (ORDER BY property DESC) column_num FROM test

    結果是 :

  

  

  上面的 ROW_NUMBER () OVER (PARTITION BY NAME ORDER BY property DESC),這行的意思是按照name分組再給name分組的數據進行編號。

  PG 和oracle差不多,只是pg中的decode函數不能像oracle那樣用,但是可以用case...when...代替。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM