检索最大值(更多列)

时间:2015-04-14 15:01:28

标签: sql oracle

我有这些信息的表

patient_id , visit_id , date_visit ( MM/DD/YYYY)
001        , 101      , 12/12/2014
001        , 102      , 12/15/2014
002        , 201      , 12/17/2014
002        , 202      , 12/18/2014

我希望结果如下

patient_id , visit_id , date_visit ( MM/DD/YYYY)
001        , 102      , 12/15/2014
002        , 202      , 12/18/2014

问题是我使用了max和group by by功能,但是当我尝试添加visit_id列时它不起作用

这是我的代码

SELECT V.PATIENT_ID , V.VISIT_ID , MAX ( V.DATE_VISIT)
FROM VISIT V
GROUP BY ( V.PATIENT_ID , V.VISIT_ID )

4 个答案:

答案 0 :(得分:0)

添加visit_id是没有意义的,因为每次访问按日期是唯一的,因此max(V.DATE_VISIT)将始终只计算一个日期。

为什么你想要V.VISIT_ID?如果您想在上次日期获取visit_ID,则必须从MAX (V.DATE_VISIT)中移除SELECT并添加一个HAVING子句,如:

HAVING V.DATE_VISIT = MAX(V.DATE_VISIT) 

HAVING V.DATE_VISIT = SELECT MAX(V.DATE_VISIT) FROM VISIT V2 WHERE V.PATIENT_ID = V2.PATIENT_ID  

答案 1 :(得分:0)

尝试分析:

  with w_data as  (
           select 001 patient_id, 101 visit_id, to_date('12/12/2014','mm/dd/yyyy') date_visit from dual union all
           select 001 patient_id, 102 visit_id, to_date('12/15/2014','mm/dd/yyyy') date_visit from dual union all
           select 002 patient_id, 201 visit_id, to_date('12/17/2014','mm/dd/yyyy') date_visit from dual union all
           select 002 patient_id, 202 visit_id, to_date('12/18/2014','mm/dd/yyyy') date_visit from dual 
           ),
     w_sub as (
        select patient_id, visit_id, date_visit,
                 row_number() over (partition by patient_id order by date_visit desc) rnum
          from w_data
        )
  select patient_id, visit_id, date_visit
    from w_sub
   where rnum = 1
  /

回来:

  PATIENT_ID   VISIT_ID DATE_VISI
  ---------- ---------- ---------
           1        102 15-DEC-14
           2        202 18-DEC-14

第一个块w_data只是模仿您的数据...您可以将其删除,然后从with w_sub ...开始,然后将w_data的后一个引用更改为您的表名。

w_sub ids每个"组" (即分区)由您的patient_id,然后按降序date_visit排序。 最后的查询只删除了每个组的第一行(即最新日期)..以及该行的所有值。

答案 2 :(得分:0)

以下查询显示每date_visitDISTINCT的最大(patient_id, visit_id)

SELECT patient_id, visit_id, max(date_visit)
FROM visit
GROUP BY patient_id, visit_id

如果您希望查看最新访问次数和访问日期(未进行核心化),那么您的查询应如下所示

SELECT patient_id, max(visit_id), max(date_visit)
FROM visit
GROUP BY patient_id

但请记住,您的数据是:

patient_id , visit_id , date_visit ( MM/DD/YYYY)
001        , 101      , 12/12/2014
001        , 102      , 12/15/2014

查询会产生结果: 001 , 102 , 12/15/2014

虽然您的数据如下所示:(注意日期变更更改)

patient_id , visit_id , date_visit ( MM/DD/YYYY)
001        , 101      , 12/15/2014
001        , 102      , 12/12/2014

然后上面的查询会产生相同的结果 - 因为您只需按patient_id对值进行分组,并期望从此分区中的不同字段获取MAX()

如果您希望获得每个patient_id的最大值,然后在date_visit为最大值的行中查看列visit_id的值,则可以通过以下方式之一执行此操作:

1)使用简单的JOIN将表自身连接到自身并获取值。

SELECT a.patient_id, b.visit_id, a.date_visit
FROM (
  SELECT patient_id, max(date_visit) AS date_visit
  FROM visit
  GROUP BY patient_id
  ) a
JOIN visit b ON
  a.patient_id = b.patient_id
  AND a.date_visit = b.date_visit

2)使用窗口函数

SELECT patient_id, visit_id, date_visit
FROM (
  SELECT patient_id, visit_id, date_visit, 
    ROW_NUMBER() OVER (PARTITION BY  patient_id ORDER BY date_visit DESC) AS rownum
  FROM visit
)
WHERE rownum = 1

上面的窗口函数只占用patient_id的分区,并且在每个不同的patient_id内,它按行date_visit对结果集进行排序,然后在其分区中分配一些行,从1.在外部选择中,您只需将date_visit MAX() patient_id的行放在WHERE的{​​{1}}子句中,使用我们在内部指定的别名查询(此处:WHERE rownum = 1)。

答案 3 :(得分:0)

选择patient_id,visit_id,date_visit FROM(   选择patient_id,visit_id,date_visit,     ROW_NUMBER()OVER(由patient_id ORDER BY date_visit DESC划分)rownumber   从访问 )笔 在哪里rownum = 1