我想从出院表中选择2015-03-16出院病人的详细资料及入院表中相应的入院资料。
排放表
录取表
这些是查询中使用的两个表。必须使用查询选择标有红色的行。
使用的查询:
SELECT a.pat_id, a.pat_name, b.admit_date, b.admit_time, b.diagnosis,
b.Dr_name, a.dis_date, a.dis_time
from discharge_details a , admission_Details b
where dis_date = Convert(Date, DATEADD(day, -1, GETDATE()))
and a.pat_id = b.patient_id
and b.Admit_status = 'discharged'
获得的输出:
必需的输出:
请...帮我修改我的查询。
答案 0 :(得分:3)
您可以使用ROW_NUMBER()来获得所需内容。由于您的Admit_Date
有理由相信哪一行可能是第一行,哪一行是最后一行,这就是为什么要添加order by
。
SELECT
data.*
FROM
(
SELECT
*, ROW_NUMBER() OVER(PARTITION BY pat_id ORDER BY admit_Date desc) as rn
FROM
table
) as data
WHERE
data.rn = 1
ORDER BY data.pat_id
CREATE TABLE #temp
(id int,pat_id varchar(200), admit_Date date)
INSERT into #temp
values
(1,'pat_123','2015-03-12'),
(2,'pat_245','2015-03-16'),
(3,'pat_123 ','2015-03-16')
上面的查询给了我,
id pat_id admit_date rn
3 pat_123 2015-03-16 1
2 pat_245 2015-03-16 1
答案 1 :(得分:1)
OUTER APPLY
在这样的场景中非常完美:
SELECT a.pat_id ,
a.pat_name ,
b.admit_date ,
b.admit_time ,
b.diagnosis ,
b.Dr_name ,
a.dis_date ,
a.dis_time
FROM discharge_details a
OUTER APPLY (SELECT TOP 1 * FROM admission_Details d WHERE a.pat_id = d.patient_id AND d.Admit_status = 'discharged' ORDER BY admit_date desc )b
WHERE a.dis_date = CONVERT(DATE, DATEADD(DAY, -1, GETDATE()))
答案 2 :(得分:1)
一些建议,如果我可以:
考虑到所有这些,表格的设计方式,您必须将出院记录与出院前患者的最新入院记录相匹配 - 并希望在同一天没有两个入院记录。如果发生这种情况,您需要获取时间字段,这会使查询复杂化。
declare
@DischargeDate datetime;
set @DischargeDate = '2015-03-16';
select ad.Patient_ID, ad.Patient_Name, ad.Admit_Date, ad.Diagnosis,
ad.Dr_Name, dd.Dis_Date
from Discharge_Details dd
join Admission_Details ad
on ad.Patient_ID = dd.Pat_ID
and ad.Admit_Date =(
select Max( Admit_Date )
from Admission_Details
where Patient_ID = dd.Pat_ID
and Admit_Date < dd.dis_date)
where dd.Dis_Date >= @DischargeDate
and dd.Dis_Date < DateAdd( day, 1, @DischargeDate );