我正在查询一个混乱的数据库,并想为每个患者提取下一个预约。由于一个人可以拥有多个不同的记录,因此由于每个记录的唯一性,他们可以为每个人拉多个下一个约会。问题是,如果一个人没有下一个约会,我想保留空值,但如果他们有下一个约会,则不要拉空值。我目前有这个功能,可以为每个患者安排一次预约,但因为它使用布尔值,所以会丢失空值。这就是我所拥有的
select distinct
from a
where a.next_appointment =
(select
min(a2.next_appointment)
from a a2
where a2.patient_id = a.patient_id
and a2.next_appointment > now()
)
or next_appointment is null
这符合我的要求吗? 如果不是我该如何修改? Vertica 是 SQL 风格。
谢谢!
如果没有一些数据和预期结果,很难判断,但也许您想获取每个患者 ID 的下一次预约列表(包括空值)。如果是这样,那么使用一些像这样的样本数据:
WITH -- S a m p l e D a t a :
tbl (PATIENT_ID, SOME_COLUMN, ANOTHER_COLUMN, NEXT_APPOINTMENT) AS
( Select 101, 'Something for 101A', 'Something else AAA', DATE '2024-06-25' From Dual Union All
Select 101, 'Something for 101B', 'Something else BBB', DATE '2024-06-30' From Dual Union All
Select 101, 'Something for 101C', 'Something else CCC', Null From Dual Union All
Select 102, 'Something for 102A', 'Something else DDD', DATE '2024-06-05' From Dual Union All
Select 102, 'Something for 102B', 'Something else EEE', DATE '2024-06-19' From Dual Union All
Select 103, 'Something for 103A', 'Something else FFF', Null From Dual Union All
Select 104, 'Something for 104A', 'Something else GGG', DATE '2024-06-13' From Dual
)
这已经通过 Oracle 进行了测试,但应该可以工作:
Select PATIENT_ID,
LISTAGG(NEXT_APPOINTMENT, ', ') WITHIN GROUP (Order By NEXT_APPOINTMENT) as NEXT_APPOINTMENTS
From tbl
Where Coalesce(NEXT_APPOINTMENT, SYSDATE) >= SYSDATE
Group By PATIENT_ID
/* R e s u l t : (on DATE '2024-06-06')
PATIENT_ID NEXT_APPOINTMENTS
---------- --------------------------------
101 25.06.24, 30.06.24
102 19.06.24
103
104 13.06.24 */