2017-06-13 22 views
0

我想组由马克斯(DATETIME)每个记录。但我查询有dupplicatate记录。我想不重复记录。如何使用由集团和最大(日)多记录

SQL:

select a.pmn_code, 
      a.ref_period, 
      a.SERVICE_TYPE, 
      min(a.status) keep (dense_rank last order by a.updated_dtm) as status, 
      max(a.updated_dtm) as updated_dtm 
    from  tempChkStatus a 
    group by a.pmn_code, a.ref_period, a.SERVICE_TYPE 

数据表tempChkStatus:

PMN_CODE | REF_PERIOD | SERVICE_TYPE | STATUS | UPDATED_DTM 
A  | 01/2016  | OI    | I  | 19/08/2016 10:54:44 
A  | 01/2016  | OP    | N  | 06/06/2017 15:09:55 
A  | 02/2016  | OT    | I  | 31/08/2016 08:37:45 
A  | 02/2016  | OT    | N  | 12/10/2016 11:13:56 
A  | 04/2016  | OI    | I  | 19/08/2016 10:54:44 
A  | 04/2016  | OP    | N  | 06/06/2017 15:09:55 

结果SQL:

PMN_CODE | REF_PERIOD | SERVICE_TYPE | STATUS | UPDATED_DTM 
A  | 01/2016 | OI  | I | 19/08/2016 10:54:44 
A  | 01/2016 | OP  | N | 06/06/2017 15:09:55 
A  | 02/2016 | OT  | N | 12/10/2016 11:13:56 
A  | 04/2016 | OI  | I | 19/08/2016 10:54:44 
A  | 04/2016 | OP  | N | 06/06/2017 15:09:55 

但我想结果:

PMN_CODE | REF_PERIOD | SERVICE_TYPE | STATUS | UPDATED_DTM 
A  | 01/2016  | OP    | N  | 06/06/2017 15:09:55 
A  | 02/2016  | OT    | N  | 12/10/2016 11:13:56 
A  | 04/2016  | OP    | N  | 06/06/2017 15:09:55 

请帮助我。由于提前;)

+1

那些不重复。您有一行'a.pmn_code,a.ref_period,a.SERVICE_TYPE'的每个排列。如果这不符合您的要求,那么您的查询中缺少一条业务规则。 – APC

回答

0
with tempChkStatus (

PMN_CODE, REF_PERIOD , SERVICE_TYPE , STATUS , UPDATED_DTM) as 
(
select 'A',   '01/2016'  ,'OI',    'I',  to_date('19/08/2016 10:54:44', 'dd/mm/yyyy hh24:mi:ss') from dual union all 
select 'A',   '01/2016'  ,'OP',    'N',  to_date('06/06/2017 15:09:55', 'dd/mm/yyyy hh24:mi:ss') from dual union all 
select 'A',   '02/2016'  ,'OT',    'I',  to_date('31/08/2016 08:37:45', 'dd/mm/yyyy hh24:mi:ss') from dual union all 
select 'A',   '02/2016'  ,'OT',    'N',  to_date('12/10/2016 11:13:56', 'dd/mm/yyyy hh24:mi:ss') from dual union all 
select 'A',   '04/2016'  ,'OI',    'I',  to_date('19/08/2016 10:54:44', 'dd/mm/yyyy hh24:mi:ss') from dual union all 
select 'A',   '04/2016'  ,'OP',    'N',  to_date('06/06/2017 15:09:55', 'dd/mm/yyyy hh24:mi:ss') from dual 
) 
select * from (
select e.*, max(updated_dtm) over (partition by ref_period) md from tempchkstatus e 
) 
where updated_dtm = md 
; 
+0

非常感谢!是工作。 :d – nettoon493

0

你只需要从GROUP BY删除SERVICE_TYPE

select s.pmn_code, s.ref_period, 
     min(s.SERVICE_TYPE) as service_type, 
     min(s.status) keep (dense_rank last order by s.updated_dtm) as status, 
     max(s.updated_dtm) as updated_dtm 
from tempChkStatus s 
group by s.pmn_code, s.ref_period; 

GROUP BY表达通过聚集查询定义行的回报。

这个版本使用MIN()SERVICE_TYPE。目前还不清楚你想要的结果集是什么逻辑。

+1

也许''保持'后最大(s.SERVICE_TYPE)(DENSE_RANK最后为了通过s.updated_dtm)' –

+0

感谢这么多!是工作。 :D – nettoon493