日期后的最近日期

Posted

技术标签:

【中文标题】日期后的最近日期【英文标题】:Most Recent Date after Date 【发布时间】:2016-04-25 18:43:49 【问题描述】:

我正在使用 SQL 查询来提取患者数据。我有 3 张桌子。一个包含患者数据的唯一记录(即:名字、姓氏、出生日期......)。第二个表是手术表,它记录了患者进行手术的日期和结果。第三个表是调查表,它记录了手术后所做的调查。 Patient 表中的键称为 HUN,它以一对多的关系链接 Surgery 和 Investigation 表。

我需要了解的是,每次手术后最近的调查日期是什么。一名患者可以进行多次手术,我需要知道每次手术后最近的调查日期。

这是我的数据(注意:这是虚构数据)。有 2 个手术日期:2005 年 5 月 11 日和 2010 年 11 月 22 日。在这些日期中,我需要知道手术日期之后的最近调查日期。结果应该是 2 条记录:

242424 2011-07-19 11-5-05

还有……

242424 2011-02-07 22-Nov-10

HUN     Surgery Date Investigation Date    
242424  11-May-05   2005-01-22     
242424  11-May-05   2006-03-29     
242424  11-May-05   2007-03-05     
242424  11-May-05   2008-04-01     
242424  11-May-05   2009-06-04     
242424  11-May-05   2009-06-19     
242424  11-May-05   2010-05-21     
242424  11-May-05   2011-02-07     
242424  11-May-05   2011-02-15     
242424  11-May-05   2011-07-19     
242424  11-May-05   2012-06-12     
242424  11-May-05   2012-09-18     
242424  11-May-05   2013-04-04     
242424  11-May-05   2013-10-30     
242424  11-May-05   2014-10-07     
242424  11-May-05   2015-09-09     
242424  22-Nov-10   2005-01-22     
242424  22-Nov-10   2006-03-29     
242424  22-Nov-10   2007-03-05     
242424  22-Nov-10   2008-04-01     
242424  22-Nov-10   2009-06-04     
242424  22-Nov-10   2009-06-19     
242424  22-Nov-10   2010-05-21     
242424  22-Nov-10   2011-02-07     
242424  22-Nov-10   2011-02-15     
242424  22-Nov-10   2011-07-19     
242424  22-Nov-10   2012-06-12     
242424  22-Nov-10   2012-09-18     
242424  22-Nov-10   2013-04-04     
242424  22-Nov-10   2013-10-30     
242424  22-Nov-10   2014-10-07     
242424  22-Nov-10   2015-09-09   

【问题讨论】:

提示:GROUP BY, MIN(). 戈登,已经试过了。不工作。只是给我整个调查的最短日期,而不是每次手术。这是我的结果。 HUN 手术日期 MinOfInvestigationDate 51704 11-May-05 2005-01-22 51704 22-Nov-10 2005-01-22 73403 15-Nov-68 1968-01-01 73403 11-Aug-95 1968-01-01 73403 01 -Jan-08 1968-01-01 能否请您发布用于获取您发布的数据的SELECT 查询?包括你所有的JOINs。 当然:这里是:SELECT DISTINCT T_EncounterSurgery.HUN, T_EncounterSurgery.SurgDate, T_EncounterIntervention.InvestigationDate FROM T_EncounterSurgery INNER JOIN T_EncounterIntervention ON T_EncounterSurgery.HUN = T_EncounterIntervention.HUN WHERE (((T_EncounterSurgery.SurgDate) (SELECT MAX(InvestigationDate) FROM T_EncounterIntervention t WHERE t.HUN = T_EncounterSurgery.HUN))); 在下面查看我的新答案。不过,我确实有一个问题。您的问题是,对于22-Nov-10,最新的InvestigationDate 将是2011-02-07,但从您粘贴的数据来看,它看起来应该是2005-01-22。你确定你的JOIN 是正确的吗? 【参考方案1】:

要获取最新数据的记录,您可以执行以下操作。

     $sql = 'select column_name from investigation_tbl order by tbl_field_name desc limit 2 ';
     //you can also get id specific details by passing a patient id by using WHERE in the query .

【讨论】:

感谢您的回复,Satyapria Mishra。但是手术日期来自手术表,调查日期来自调查表。它们由一个名为 HUN(又名:患者 ID)的列连接。每次手术您可以进行多次手术和多项检查。【参考方案2】:

根据提供的信息,这里是脚本。

CREATE TABLE #Investigation
    (
      HUN INT
    , Surgery_Date DATE
    , Investigation_Date DATE
    );

INSERT  INTO #Investigation
        ( HUN, Surgery_Date, Investigation_Date )
VALUES  ( 242424, '11-May-05', '2005-01-22' )
,       ( 242424, '11-May-05', '2006-03-29' )     
,       ( 242424, '11-May-05', '2007-03-05' )     
,       ( 242424, '11-May-05', '2008-04-01' )     
,       ( 242424, '11-May-05', '2009-06-04' )     
,       ( 242424, '11-May-05', '2009-06-19' )     
,       ( 242424, '11-May-05', '2010-05-21' )     
,       ( 242424, '11-May-05', '2011-02-07' )     
,       ( 242424, '11-May-05', '2011-02-15' )     
,       ( 242424, '11-May-05', '2011-07-19' )     
,       ( 242424, '11-May-05', '2012-06-12' )     
,       ( 242424, '11-May-05', '2012-09-18' )     
,       ( 242424, '11-May-05', '2013-04-04' )     
,       ( 242424, '11-May-05', '2013-10-30' )     
,       ( 242424, '11-May-05', '2014-10-07' )     
,       ( 242424, '11-May-05', '2015-09-09' )     
,       ( 242424, '22-Nov-10', '2005-01-22' )     
,       ( 242424, '22-Nov-10', '2006-03-29' )     
,       ( 242424, '22-Nov-10', '2007-03-05' )     
,       ( 242424, '22-Nov-10', '2008-04-01' )     
,       ( 242424, '22-Nov-10', '2009-06-04' )     
,       ( 242424, '22-Nov-10', '2009-06-19' )     
,       ( 242424, '22-Nov-10', '2010-05-21' )     
,       ( 242424, '22-Nov-10', '2011-02-07' )     
,       ( 242424, '22-Nov-10', '2011-02-15' )     
,       ( 242424, '22-Nov-10', '2011-07-19' )     
,       ( 242424, '22-Nov-10', '2012-06-12' )     
,       ( 242424, '22-Nov-10', '2012-09-18' )     
,       ( 242424, '22-Nov-10', '2013-04-04' )     
,       ( 242424, '22-Nov-10', '2013-10-30' )     
,       ( 242424, '22-Nov-10', '2014-10-07' )     
,       ( 242424, '22-Nov-10', '2015-09-09' );

SELECT  *
FROM    #Investigation;

SELECT  HUN
      , Surgery_Date
      , MAX(Investigation_Date) AS LatestInvestigation
      , MIN(Investigation_Date) AS EarliestInvestigation
FROM    #Investigation
GROUP BY HUN
      , Surgery_Date;

【讨论】:

【参考方案3】:

如果您的 SQL Server 支持公用表表达式 (CTE),那么最好的方法是:

;with t as (
select HUN,Surgery_Date,Investigation_Date,
ROW_NUMBER() over(partition by hun,Surgery_Date order by  Investigation_Date ) rn
from #Investigation
where Investigation_Date>Surgery_Date
)
select * from t
where rn=1
order by Surgery_Date desc

注意:在 MS SQL Server 上创建和测试。

【讨论】:

表格定义和数据是从问题的编辑版本中借来的【参考方案4】:

我相信,汇总您的患者 ID 和手术列会得到您需要的信息:

SELECT DISTINCT T_EncounterSurgery.HUN, T_EncounterSurgery.SurgDate, MIN(T_EncounterIntervention.InvestigationDate)
FROM T_EncounterSurgery 
INNER JOIN T_EncounterIntervention ON 
    T_EncounterSurgery.HUN = T_EncounterIntervention.HUN 
WHERE (((T_EncounterSurgery.SurgDate)<=(SELECT MAX(InvestigationDate) FROM T_EncounterIntervention t WHERE t.HUN = T_EncounterSurgery.HUN)))
GROUP BY 1, 2

【讨论】:

感谢您的回复,gr1zzly be4r。但是手术日期来自手术表,调查日期来自调查表。它们由一个名为 HUN(又名:患者 ID)的列连接。每次手术您可以进行多次手术和多项检查。

以上是关于日期后的最近日期的主要内容,如果未能解决你的问题,请参考以下文章

Excel如何根据日期自动抓取数据?

easyUI日期控件只选择月份和日期

以mysql日期格式计算日期后的“x”天[重复]

开始日期后的 Laravel 验证结束日期不起作用

mysql计算日期的函数

mysql计算日期的函数