sql - 如何从最接近table1的DATE FIELD的table2中提取数据?

标签 sql sql-server tsql sql-server-2012

我有以下两个表诊断和锻炼 我想提取最接近 Diagnose_Date 的锻炼日期,它应该是锻炼表中的 1 行。

我已经尝试在 where 条件下使用 DATEDIFF 函数进行左连接

SELECT D.ID,D.Diagnose_Date,D.Type1,D.Type2,E.Exercise_Date],E.Field1,E.Field2,E.Field3
FROM Diagnose D
LEFT JOIN Exercise E
ON D.ID=E.ID
WHERE DATEDIFF(DAY,[Diagnose_Date],[Exercise_Date]) BETWEEN -30 AND 30

任何帮助都会很有帮助

提前致谢


诊断表

------------------------------------------
ID     Dignose_Date     Type1    SubType1    
------------------------------------------
1      10/01/2010       01       1.1
2      20/02/2012       02       2.2
3      30/03/2013       01       1.2
------------------------------------------

运动表

------------------------------------------
ID     Exercise_Date  Field1  Field2  Field3
------------------------------------------
1      01/01/2010        x       y      z
2      10/02/2012        a       b      c
2      01/04/2012        e       f      f
3      01/03/2013        x       y      z
3      05/04/2013        a       b      c
3      01/06/2013        x       y      z
------------------------------------------

预期结果应该是:

------------------------------------------------------------------------
ID  Diagnose_Date  Exercise_Date Type1 SubType2  Field1  Field2  Field3
------------------------------------------------------------------------
1   10/01/2010     01/01/2010     01    1.1         x       y        z
2   20/02/2012     10/02/2012     02    2.2         a       b        c
3   30/03/2013     05/04/2013     01    1.2         a       b        c
-------------------------------------------------------------------------

最佳答案

首先,在 CTE 中,对于每个诊断,获取诊断日期和与该诊断相关的所有练习日期之间的最小时间间隔。

WITH MIN_DATES_CTE(ID, DATE_DIFF)
AS (
    SELECT ID, MIN(ABS(DATEDIFF(DAY,[Diagnose_Date],[Exercise_Date])))
    FROM Exercise E
    INNER JOIN Diagnose D ON D.ID = E.ID
    GROUP BY E.ID
)

然后,按ID和最小时间间隔加入Diagnose和Exercise

SELECT D.ID,D.Diagnose_Date,D.Type1,D.Type2,E.Exercise_Date],E.Field1,E.Field2,E.Field3
FROM Diagnose D
LEFT JOIN Exercise E ON D.ID = E.ID
INNER JOIN MIN_DATES_CTE ON MIN_DATES_CTE.ID = E.ID
WHERE ABS(DATEDIFF(DAY,[Diagnose_Date],[Exercise_Date])) = MIN_DATES_CTE.DATE_DIFF

关于sql - 如何从最接近table1的DATE FIELD的table2中提取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19837373/

相关文章:

sql - 在 SELECT 语句中使用 'previous' 列的结果

mysql - 如何从 SQL 中的表中进行选择,其中列中的元素仅包含另一列的一个特征,而另一列本身又包含两个特征?

mysql - 省略以特定字符开头的结果

c# - SQL Server 2012 升级 : StackOverflowException with ExecuteReader()

sql-server - SQL - 根据列查找公共(public)行(相交)

sql - 什么时候应该使用 CROSS APPLY 而不是 INNER JOIN?

mysql - SQL查询: single row per group

mysql - MySQL 中何时使用单引号、双引号和反引号

java - 从 Java 类内部调用存储过程并写入控制台?

c# - 如何使用 LINQ 仅返回列的第一个字符在某个范围内的行?