zoukankan      html  css  js  c++  java
  • 数据库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...代替。

  • 相关阅读:
    Linux内存管理 —— 为buddy做准备:MMU, TLB, ZONE【转】
    Linux内存管理 —— 文件系统缓存和匿名页的交换【转】
    linux内存源码分析
    Linux中匿名页的反向映射【转】
    zram 简介【转】
    Linux Swap 与 Zram 详解【转】
    Linux中的mmap映射 [一]【转】
    Linux中的mmap映射 [二]【转】
    python测试开发django-rest-framework-95.文件上传接口开发
    Airtest IDE 自动化测试8
  • 原文地址:https://www.cnblogs.com/lioa/p/12072961.html
Copyright © 2011-2022 走看看