日期后的最近日期
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
查询?包括你所有的JOIN
s。
当然:这里是: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)的列连接。每次手术您可以进行多次手术和多项检查。以上是关于日期后的最近日期的主要内容,如果未能解决你的问题,请参考以下文章