数据库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...代替。

posted @ 2019-12-20 14:35  正宗老菜鸟  阅读(7158)  评论(3编辑  收藏  举报