如何在记录上选择min datediff值

时间:2016-08-09 10:53:00

标签: sql-server sql-server-2012

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

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

我尝试在下面的查询中使用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

1 个答案:

答案 0 :(得分:1)

    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

你可以使用OUTER APPLY来LEFT JOIN到子查询的TOP 1 - 然后对你要加入子查询的LEFT行存在子查询 - 其中子查询是TOP 1,它将加入1到1(如果没有行则为1,否则为1)