【问题标题】:How use Group by and Max(date) multi record如何使用 Group by 和 Max(date) 多记录
【发布时间】:2017-06-13 12:10:15
【问题描述】:

我希望每条记录按 Max(Datetime) 分组。但我查询有重复的记录。我不想重复记录。

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

请帮帮我。谢谢提前;)

【问题讨论】:

  • 那些不是重复的。 a.pmn_code, a.ref_period, a.SERVICE_TYPE 的每个排列都有一行。如果这不是您想要的,您的查询中缺少业务规则。

标签: sql oracle datetime group-by max


【解决方案1】:
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
;

【讨论】:

    【解决方案2】:

    您只需从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 表达式定义聚合查询返回的行。

    此版本在SERVICE_TYPE 上使用MIN()。不清楚您希望结果集的逻辑是什么。

    【讨论】:

    • 也许keep (dense_rank last order by s.updated_dtm)after max(s.SERVICE_TYPE)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多