【问题标题】:Return Most Recent Time返回最近时间
【发布时间】:2011-04-11 15:36:17
【问题描述】:

我有一个复杂的连接过程,我需要返回 X 日期 X 患者的最近时间。

SELECT  CONVERT(varchar(36), apt.UniqueID), 
        apt.atime, 
        RTRIM(apt.apwork) + ' ' + RTRIM(apt.apwrk2),
        aps.apsdispchar,
        RTRIM(LTRIM(aps.apstextcolor)),
        RTRIM(LTRIM(aps.apsbgcolor)),
        apT.apid,
        dbo.MakeCaseString(pat.pfname, pat.pfnamcase) + ' ' + dbo.MakeCaseString(pat.plname, pat.plnamcase),
        apn.apnentrytime
        FROM apt INNER JOIN pat ON pat.pid = apt.apid INNER JOIN aps on ((apt.aconfstat IS NOT NULL AND apt.aconfstat = aps.apsid) OR (apt.aconfstat IS NULL AND aps.apsid = ' ')) INNER JOIN apn ON (apn.apnpid = apt.apid AND apn.apndate = apt.adate AND apn.apntime = apt.atime)
WHERE apt.adid = @ProviderIDParam   AND apt.adate = @DateParam AND apn.apnentrytime IN (SELECT MAX(apn.apnentrytime) FROM apn)
ORDER BY apt.atime ASC

目前我正在使用:

apn.apnentrytime IN (SELECT MAX(apn.apnentrytime) FROM apn)

它适用于某些数据,而其他数据(相当大)则不起作用。

【问题讨论】:

  • Microsoft SQL Server 管理 2008。
  • 如果不问RTRIM、LTRIM等问题,你应该把问题归结为它的核心。我想你需要一些分组,但我当然不想花几个小时来理解 pfnamcase 是什么。
  • 仅供参考,大多数人只是将其称为 SQL Server 2008。您可以删除管理
  • 澄清一下,一切正常,期待我的 WHERE 语句:apn.apnentrytime IN (SELECT MAX(apn.apnentrytime) FROM apn)

标签: sql


【解决方案1】:

您需要将子查询与患者 ID 上的外部查询相关联(我假设是 pat.pid)。

Select Cast(apt.UniqueID As varchar(36))
    , apt.atime
    , RTRIM(apt.apwork) + ' ' + RTRIM(apt.apwrk2)
    , aps.apsdispchar
    , RTRIM(LTRIM(aps.apstextcolor))
    , RTRIM(LTRIM(aps.apsbgcolor))
    , apT.apid
    , dbo.MakeCaseString(pat.pfname, pat.pfnamcase) + ' ' + dbo.MakeCaseString(pat.plname, pat.plnamcase)
    , apn.apnentrytime
From apt 
    Inner Join pat 
        ON pat.pid = apt.apid 
    Inner Join aps 
        On ((apt.aconfstat Is Not Null And apt.aconfstat = aps.apsid) 
            Or (apt.aconfstat IS NULL And aps.apsid = ' ')) 
    Inner Join apn 
        On (apn.apnpid = apt.apid 
            And apn.apndate = apt.adate 
            And apn.apntime = apt.atime)
Where apt.adid = @ProviderIDParam   
    And apt.adate = @DateParam 
    And apn.apnentrytime IN (   
                            Select Max(APN1.apnentrytime) 
                            From apn As APN1
                                Join apt As APT1
                                    On APT1.apid = APN1.apnpid
                                        And APT1.adate = APN1.apndate
                                        And APT1.atime = APN1.apntime
                            Where APT1.apid = pat.pid
                            )
Order By apt.atime ASC

【讨论】:

  • 谢谢,但我收到此错误:聚合可能不会出现在 WHERE 子句中,除非它位于 HAVING 子句或选择列表中包含的子查询中,并且正在聚合的列是外部引用。
  • @Wesley Pattison - 我在修复的子查询中有错字。我引用了错误的表别名。
  • 嗯。好的,好像好多了,谢谢但它仍然没有返回所述日期的所有约会。我会看看它并报告。
  • 必须做一个小的修改才能使它工作: APT1.apid = pat.pid AND APT1.atime = apn.apntime AND APT1.adate = apn.apndate 谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-05-10
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多