Я не использовал SQL годами, и эта проблема немного за мной.
У меня есть набор датированных записей в листе Excel, которые я запрашиваю с помощью соединителя oledb. Если некоторые поля (например, Имя, Электронная почта и Фрукты) совпадают с другой записью, они считаются дубликатами. Но у них есть другие поля, которые могут быть уникальными.
Мне нужно обработать этот набор так, чтобы у меня было:
(1) Набор уникальных записей с самым ранним экземпляром дублированных записей. Если у них одна и та же дата (что может случиться), не имеет значения, какая у меня (но одна должна быть в уникальном наборе, остальные в дублирующем наборе)
(2) Набор более поздних / оставшихся повторяющихся записей
В качестве примера набора данных. Дано:
Name Email Comment Fruit Date Foo
John Smith johnsmith@mail.com lorem ipsum apple 2019-05-06 bar
Joe Bloggs - dolor sit amet banana 2019-05-28 bar
John Smith johnsmith@mail.com adipiscing elit apple 2019-05-16 fizz
Lawry Tripp - sed do eiusmod pear 2019-05-06 fizzbuzz
Mike Davos mikedavos@mail.com tempor incididunt pear 2019-05-28 bar
Mike Davos mikedavos@mail.com ut labore et pear 2019-05-28 foo
Talor Quimby - dolore magna kumquat 2019-05-16 foobar
Gob Bloggs - dolor sit amet banana 2019-05-28 bar
Мне нужны наборы
(1) * * 1014
Name Email Comment Fruit Date Foo
John Smith johnsmith@mail.com lorem ipsum apple 2019-05-06 bar
Joe Bloggs - dolor sit amet banana 2019-05-28 bar
Lawry Tripp - sed do eiusmod pear 2019-05-06 fizzbuzz
Mike Davos mikedavos@mail.com tempor incididunt pear 2019-05-28 bar
Talor Quimby - dolore magna kumquat 2019-05-16 foobar
Gob Bloggs - dolor sit amet banana 2019-05-28 bar
и
(2)
John Smith johnsmith@mail.com adipiscing elit apple 2019-05-16 fizz
Mike Davos mikedavos@mail.com ut labore et pear 2019-05-28 foo
Пока я смог получить
(а) набор уникальных записей
(б) набор всех дубликатов
Но я застрял в написании запроса, который с учетом (b) извлечет самую раннюю дату из каждой группы и добавит ее в (a) (поэтому создаю первый выходной набор, который мне требуется). Я предполагаю, что каким бы ни был этот запрос, я могу вычесть его результаты из (b), чтобы получить оставшиеся дубликаты.
(Извините, я пытался включить SQL для создания тестовой таблицы, но при включении SO помечает сообщение как спам и не позволяет публиковать его)
Этот запрос я использую для получения набора уникальных записей (а):
FROM (
SELECT * FROM data
GROUP BY
Name, Email, Fruit
HAVING
COUNT(*) = 1
) t1
JOIN
data t2 ON t1.Name = t2.Name AND t1.Email = t2.Email AND t1.Fruit = t2.Fruit
И обратный запрос для получения дубликатов (б):
FROM (
SELECT * FROM data
GROUP BY
Name, Email, Fruit
HAVING
COUNT(*) >= 2
) t1
JOIN
data t2 ON t1.Name = t2.Name AND t1.Email = t2.Email AND t1.Fruit = t2.Fruit
Из того, что я могу найти, кажется, что это называется проблемой группового минимума. Но я нахожусь в пределах моего SQL. В рассмотренных мною решениях используются общие табличные выражения / CTE, но я не думаю, что моя среда (oledb) их поддерживает.
Мне кажется, что я близок, мне просто нужно правильно запросить дубликат набора и соединить его с уникальным набором / вычесть его из себя, чтобы получить конечные результаты.
Какой запрос я могу написать, чтобы правильно разбить этот набор дубликатов?