我有一张桌子上有病人的身份证,联系日期和行动代码。我希望检索所有行,其操作代码等于EPS或D,但是,如果操作代码存在于同一联系人日期,则只希望保留一行。
例如,这是我表的一部分,日记:
PatientID Contactdate Actioncode
1 2010-5-6 EPS
1 2010-5-6 D
1 2012-3-4 CNT
1 2013-7-8 D
2 2010-1-4 EPS
2 2010-5-6 D这是我现在要检索的所有行的代码,这些行的actioncode是EPS或D。
select * from journal j where j.actioncode in ('EPS', 'D')我试着按接触式分组,但后来我错过了病人不同的行。同样的效果发生在不同的(接触式)。当日期和病人相似且操作代码为D或EPS时,我可以在这里只返回一行吗?
优先结果:
PatientID Contactd Actioncode
1 2010-5-6 D
1 2012-3-4 D
2 2010-1-4 EPS
2 2010-5-6 D发布于 2019-05-31 10:32:03
您需要的是一个GROUP BY两列: PatientID和Contactdate。您可以使用MAX()或MIN()来选择一行。
select
j.PatientID,
j.Contactdate,
MIN(j.actionCode)
from
journal j
where j.actioncode in ('EPS', 'D')
group by j.PatientID, j.Contactdate 为了匹配您喜欢的结果,您应该使用MIN()。
发布于 2019-05-31 10:35:12
我们可以在这里尝试使用ROW_NUMBER:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY PatientID, Contactdate
ORDER BY Actioncode) rn
FROM journal
WHERE Actioncode in ('EPS', 'D')
)
SELECT PatientID, Contactdate, Actioncode
FROM cte
WHERE rn = 1;如果两个动作代码都出现,这将任意保留Actioncode='D'记录。如果希望保留EPS记录,则修改对ROW_NUMBER的调用以使用ORDER BY Actioncode DESC。
发布于 2019-05-31 10:43:41
你可以和UNION公司一起做这两件事:
select * from journal where actioncode = 'D'
union all
select * from journal j where j.actioncode = 'EPS'
and not exists (
select 1 from journal
where PatientID = j.PatientID and Contactdate = j.Contactdate and actioncode = 'D'
)第二个查询仅在第一个查询不返回actioncode = 'D'的情况下才会获取行。
见演示。
结果:
> patientid | contactdate | actioncode
> --------: | :---------- | :---------
> 1 | 2010-05-06 | D
> 1 | 2013-07-08 | D
> 2 | 2010-05-06 | D
> 2 | 2010-01-04 | EPS https://stackoverflow.com/questions/56393317
复制相似问题