Sql server 如何在记录上选择min datediff值

Sql server 如何在记录上选择min datediff值,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一个登记参加一系列活动的联系人数据库。数据库还包含一个地址信息表。通常,个人联系人有多个地址记录 我需要一个查询,返回个人的活动预订,以及他们最近地址记录中的邮政编码(相对于活动日期) 我试图在下面的查询中使用min(DATEDIFF),但是尽管它正确地计算了事件预订和地址记录创建之间的日期差,但是当个人有多个地址记录时,查询仍然返回重复的结果 如果有人能在下面的查询中告诉我哪里出了问题,或者建议更好的方法来获得结果,我将不胜感激: SELECT ep.EVENTPLACENO, ad.PO

我有一个登记参加一系列活动的联系人数据库。数据库还包含一个地址信息表。通常,个人联系人有多个地址记录

我需要一个查询,返回个人的活动预订,以及他们最近地址记录中的邮政编码(相对于活动日期)

我试图在下面的查询中使用min(DATEDIFF),但是尽管它正确地计算了事件预订和地址记录创建之间的日期差,但是当个人有多个地址记录时,查询仍然返回重复的结果

如果有人能在下面的查询中告诉我哪里出了问题,或者建议更好的方法来获得结果,我将不胜感激:

SELECT ep.EVENTPLACENO, ad.POSTCODE, min(DATEDIFF(dd,ep.CREATIONDATE,ad.CREATIONDATE)) as datediff
FROM EVENTPLACE as ep
LEFT OUTER JOIN EVENTMODULE as em ON em.EVENTMODULENO=ep.EVENTMODULENO
LEFT OUTER JOIN ADDRESS as ad ON ad.CONTACTNO=ep.CONTACTNO
WHERE em.EVENTMODULENO = '1111111-2222222-3333333-4444444'
GROUP BY ep.EVENTPLACENO, ad.POSTCODE

您可以使用OUTER APPLY to LEFT JOIN到子查询的顶部1-然后子查询存在于您要连接到子查询的左侧行-如果子查询是顶部1,它将1连接到1(如果没有行,则1连接到null)

添加行号()到(按ep.EVENTPLACENO划分,按日期区分的ad.POSTCODE顺序)(dd,ep.CREATIONDATE,ad.CREATIONDATE))作为rown然后将查询作为派生查询查询,选择rown=1和REW-这非常有效。我以前从未使用过外部应用。非常感谢您的帮助。
    SELECT ep.EVENTPLACENO, ad.POSTCODE, min(ad.CREATIONDATE) as datediff 
FROM EVENTPLACE as ep
LEFT OUTER JOIN EVENTMODULE as em ON em.EVENTMODULENO=ep.EVENTMODULENO
 OUTER APPLY (SELECT TOP 1 *  FROM ADDRESS ad2 WHERE  ad2.CONTACTNO=ep.CONTACTNO ORDER BY DATEDIFF(dd,ep.CREATIONDATE,ad2.CREATIONDATE)) AD
WHERE em.EVENTMODULENO = '1111111-2222222-3333333-4444444'
GROUP BY ep.EVENTPLACENO, ad.POSTCODE