我有一张桌子,上面有患者的ID,联系日期和操作代码。我想检索动作代码等于EPS或D的所有行,但是如果动作代码存在于同一contactdate上,我只想保留一行。
例如,这是我的表格日记的一部分:
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
这是我现在要检索动作代码为EPS或D的所有行的代码
select * from journal j where j.actioncode in ('EPS', 'D')
我尝试按contactdate分组,但随后我错过了患者不同的行。相同的效果发生在distinct(contactdate)。当日期和患者编号相似且操作码为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
答案 0 :(得分:2)
我们可以在此处尝试使用IF
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
。
答案 1 :(得分:1)
您需要一个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()
。
答案 2 :(得分:1)
对于2种情况,您都可以使用UNION ALL做到:
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'
返回任何内容时,第二个查询才会获取行。
请参见demo。
结果:
> patientid | contactdate | actioncode
> --------: | :---------- | :---------
> 1 | 2010-05-06 | D
> 1 | 2013-07-08 | D
> 2 | 2010-05-06 | D
> 2 | 2010-01-04 | EPS