- 關鍵字 row_number() over (partition by)
例如,下面的數據, 這是按照name分組后,展示property值。

我們想得到這樣的值;

- 第一步:將每一組的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...代替。
