如果只有一列不同,我怎么只能得到一行

时间:2019-05-31 10:26:39

标签: postgresql

我有一张桌子,上面有患者的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

3 个答案:

答案 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