2016-08-09 36 views
2

我有一个已注册参加一系列事件的联系人数据库。该数据库还包含一个地址信息表。通常,单个联系人具有多个地址记录。如何在记录中选择最短日期值

我需要一个查询返回个人的事件预订,以及从他们最近的地址记录(相对于事件日期)的邮编。

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

add ROW_NUMBER()OVER(PARTION BY ep.EVENTPLACENO,ad.POSTCODE ORDER BY DATEDIFF(dd,ep.CREATIONDATE,ad.CREATIO NDATE))作为rown,然后查询查询作为派生查询,选择rown = 1 – Cato

回答

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 )

+0

Andrew - 这很好。我以前从未使用过OUTER APPLY。非常感谢您的帮助。 – Jon295087