从表中选择最后一次出现的行

时间:2015-03-17 12:09:43

标签: sql sql-server

我想从出院表中选择2015-03-16出院病人的详细资料及入院表中相应的入院资料。

排放表

enter image description here

录取表

enter image description here

这些是查询中使用的两个表。必须使用查询选择标有红色的行。

使用的查询:

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'

获得的输出:

enter image description here

必需的输出:

enter image description here

请...帮我修改我的查询。

3 个答案:

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

一些建议,如果我可以:

  1. 将日期和时间字段合并到一个日期时间字段中。像这样分开它们会导致问题无止境。如果患者入院并出院,然后在同一天重新入院和出院怎么办?它发生了。
  2. 在排放表中没有重复患​​者数据。事实上,它甚至不应该在录取表中。应该有一个Patient表,就此而言,还有一个Doctors表,其中包含名称和其他此类属性。
  3. 每次入场都是代理主键。然后,放电将包含相关准入的相同关键值。那样这个放电肯定与 入场有关。你拥有它的方式,我们只是做了一个合格的猜测。数据库不好。
  4. ward_number和ward_type等属性也应该放在一个单独的表中。患者从一个病房移动到另一个病房时会发生什么?你更新入学表吗?状况不佳 - 你会忘记患者的病情。你是否向新病房出院并再次入院?太多不必要的数据库诽谤。特别是当你认为你正在做所有这些只是为了撒谎。
  5. Admit_Status字段的相同建议。每次状态更改时都会更新吗?您应该跟踪这些重要的变化,并能够复制从最初入院到最终出院的每个状态变化 - 不仅仅是新状态,而是制作时间,医生批准的以及其他重要信息。
  6. 考虑到所有这些,表格的设计方式,您必须将出院记录与出院前患者的最新入院记录相匹配 - 并希望在同一天没有两个入院记录。如果发生这种情况,您需要获取时间字段,这会使查询复杂化。

    SQL Fiddle

    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 );