SQL SERVER - получать записи по самой ранней дате в течение года - PullRequest
0 голосов
/ 03 апреля 2019

Немного сложный для меня.

У меня есть база данных, содержащая сотни тысяч записей, многие из которых дублируются.

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

Пока у меня есть ниже ...

Шаг 1 - определить самую раннюю дату для каждой записи

SELECT MIN(CreateDate) AS Date, Email FROM Results R
WHERE (R.Email IS NOT NULL AND R.Email <> '')
GROUP BY R.Email

Я создал это как представление и назвал его EarliestInteraction

Шаг 2 - получить все за последний год

Примечание - поэтому мне нужны записи за последний год, но они также должны быть в таблице журнала. Таким образом, все записи за последний год, которые также присутствуют в некоторых таблицах журналов.

Пока я сделал это ...

SELECT * FROM EarliestInteraction ECI
WHERE ( CAST(ECI.Date AS DATE) >= CAST(GETDATE() - 365 AS DATE) )
AND (

    EXISTS (
        SELECT Id FROM LOG1 R
        WHERE Source = 'LOGGED'
        AND R.Email = ECI.Email
    )

    OR

    EXISTS (
        SELECT Id FROM LOG2 R WHERE (R.Email IS NOT NULL AND R.Email <> '')
        AND R.Email = ECI.Email
            AND R.EventType IN (
            'LOGGED'
    ))
)

У меня вопрос, это хороший способ сделать это и точно?

Или я упускаю что-то, что вернет более ранние дубликаты ...

Любые мысли о том, является ли это точным или достигает краткости, было бы замечательно.

1 Ответ

0 голосов
/ 03 апреля 2019

Вы хотите записи, в которых нет записей на тот же адрес электронной почты до этого года:

select r.*
from results r
where not exists (select 1
                  from results r2
                  where r2.email = r.email and
                        r2.created_date < dateadd(year, -1, getdate())
                 );
...