我有这些信息的表
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 )
答案 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_visit
对DISTINCT
的最大(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