2015-01-06 2 views
0

В SQL Server 2008 я хочу объединить две таблицы в зависимости от последовательности дат. Более конкретно, мне нужно налево присоединиться Payments таблицы Profiles таблицу по следующим правилам:Соедините две таблицы в зависимости от последовательности дат

  1. UserId должно быть согласовано.

  2. Каждая запись в Payments соответствует записи в Profiles с ближайшим Profiles.CreationDate перед Payments.PayDate.

Для упрощенного примера,

Table Payments: 
UserId PayDate Amount 
1  2012 400 
1  2010 500 
2  2014 600 

Table Profiles: 
UserId CreationDate Address 
1  2009   NY 
1  2015   MD 
2  2007   NJ 
2  2013   MA 
3  2008   TX 

Desired Result: 
UserId CreationDate PayDate Amount Address 
1  2009   2010 500 NY 
1  2009   2012 400 NY 
2  2013   2014 600 MA 

Это гарантирует, что пользователь имеет по крайней мере 1 Profiles запись, прежде чем он платит. Другое ограничение заключается в том, что я не уполномочен ничего писать в базе данных.

Я идея первая оставила присоединиться Payments с Profiles, то в записи группы, соответствующей каждому (UserId, PayDate) кортежа, сортировки по CreationDate, затем выберите последнюю запись. Но я не знаю, как реализовать его на языке SQL, или есть ли какие-либо лучшие способы сделать это слияние?

+1

это очень плохой дизайн базы данных ... КОСМИЧЕСКОГО ОТНОСИТЬСЯ с TOP 1 запись с ORDER BY DATEDIFF – mxix

ответ

2

Используйте Outer Apply для этого.

SELECT py.UserId, 
     CreationDate, 
     PayDate, 
     Amount, 
     Address 
FROM Payments py 
     OUTER APPLY (SELECT TOP 1 * 
        FROM Profiles pr 
        WHERE py.UserId = pr.UserId 
        and PayDate> CreationDate 
        ORDER BY CreationDate desc) cs 

SQLFIDDLE DEMO

Смежные вопросы