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)

 

posted @ 2020-04-12 09:52  changlinlo  阅读(3361)  评论(0编辑  收藏  举报