2013-06-04 2 views
0

У меня есть 2 таблицы, одна с информацией, генерирующей активность, другая с новой информацией о контракте. В конечном итоге то, что я пытаюсь сделать, это увидеть, если в течение 30 дней после даты активности был создан новый контракт. Так, например:SQL Join using floating Where Date

Activties

Contracts

Первая таблица является таблицей деятельности, то второй стол контракт. Как вы увидите, например, учетная запись ABC123 имеет новый контракт в течение 30 дней с даты деятельности - CT-7135. Тем не менее, CT-7695, хотя он существует в таблице и связан с учетной записью ABC123, не удовлетворяет требованию «нового контракта» b/c, которое оно запускало за пределами 30-го окна с даты действия.

Счет GJ1234, однако, был бы «нет» b/c, в таблице нет контракта, который находится в течение 30 дней с даты активности. Аналогично CGE435 (из-за CT-4389) и GHE568 (из-за контрактов CT-4389, CT-8080 AND/OR CT-6690 ---- НО НЕ из-за CT-6829) оба квалифицируются.

Я полагаю, что моя проблема пытается сделать это динамическое объединение даты активности b/c, для разных позиций оно отличается.

Мысли?

Спасибо.

ответ

0

Попробуйте это:

Select Distinct AccountId 
From Accounts a 
Where Exists 
    (Select * From contracts 
    Where AccountId = a.AccountId 
     And ContractDate >= a.ActivityDate 
     And DateDiff(day, a.ActivityDate, ContractDate) <= 30) 
0

Ниже представлены все учетные записи, которые имели новый контракт в течение 30 дней деятельности:

SELECT * FROM activities AS A WHERE AccountID IN (SELECT DISTINCT(AccountID) from contracts WHERE ContractStartDate >= A.ActivityDate AND ContractStartDate <= DATE_ADD(A.ActivityDate, INTERVAL DAY 30))