• SQL按照某一列数据去重并显示整行信息(以一列为基准去重)


    总会碰到一些奇奇怪怪的需求,各种加字段阿、建视图阿等等,然后使用了group by 还是没有达到想要的结果,那咋办嘛。

    0.需求背景 

     根据MLOT重复字段 取 TRANSACTIONTIME 最小时间的一列,  (MLOT已经用过group by分组 order by排序)

     所以我们可以用(ROWNUM)伪列函数 +  (MAX)取最大值函数 ||  (MIN)取最小值函数配合 再次使用group by 分组

    1.首先把问题表加上伪列(rownum)--记得根据你要分组的列排序一下

    --表记得改你自己的--   请参考 select rownum rn,a.* from 你的表 a
    /* Formatted on 2020/4/12 9:37:03 (QP5 v5.256.13226.35538) */
    SELECT ROWNUM RN, a.*
      FROM (  SELECT *
                FROM epidm.B_DM_MMS_PVD_INOUT
               WHERE MLOT IN ('P3DAR1931509',
                              'P3DAR1931510',
                              'P3DAR1931601',
                              'P3DAR1931602',
                              'P3DAR1931610',
                              'P3DAR1931611')
            ORDER BY MLOT) a

     2.然后再根据用过伪列的sql当作一张表进行子查询

     -- 子查询且分组  当然你也可以再GROUP BY MLOT 前面进行 where 筛选                    
    /* Formatted on 2020/4/12 9:34:48 (QP5 v5.256.13226.35538) */
    SELECT *
      FROM (SELECT ROWNUM rn, a.*
              FROM (  SELECT *
                        FROM epidm.B_DM_MMS_PVD_INOUT
                       WHERE MLOT IN ('P3DAR1931509',
                                      'P3DAR1931510',
                                      'P3DAR1931601',
                                      'P3DAR1931602',
                                      'P3DAR1931610',
                                      'P3DAR1931611')
                    ORDER BY MLOT) a) B
     WHERE rn IN (  SELECT MIN (rn)
                      FROM (SELECT ROWNUM rn, a.*
                              FROM (  SELECT *
                                        FROM epidm.B_DM_MMS_PVD_INOUT
                                       WHERE MLOT IN ('P3DAR1931509',
                                                      'P3DAR1931510',
                                                      'P3DAR1931601',
                                                      'P3DAR1931602',
                                                      'P3DAR1931610',
                                                      'P3DAR1931611')
                                    ORDER BY MLOT) a) B
                  GROUP BY MLOT)
                  

     W.参考模板

    /* Formatted on 2020/4/12 9:46:14 (QP5 v5.256.13226.35538) */
    SELECT *
      FROM 你的表
     WHERE 伪列名称 IN (  SELECT MAX (伪列名称)
                                FROM 你的表
                            GROUP BY 你要分组的列) --也可以进行where 筛选
    --首先table 表要有rownum伪列函数 并取个名称  这里我取的是rn
    select * from table
    where rn in (select Max(rn) from table group by mlot)
  • 相关阅读:
    bzoj 2038 [2009国家集训队]小Z的袜子(hose)
    搭配飞行员
    codevs 1022 覆盖
    Tyvj-1338 QQ农场
    bzoj 3894 文理分科
    bzoj 1877 [SDOI2009]晨跑
    poj 3304 判断是否存在一条直线与所有线段相交
    poj 2318 向量的叉积二分查找
    poj 3608 凸包间的最小距离
    LA 4728 旋转卡壳算法求凸包的最大直径
  • 原文地址:https://www.cnblogs.com/lin02/p/12683826.html
Copyright © 2020-2023  润新知