Как разбить таблицу на набор уникальных значений с другим набором оставшихся дубликатов - PullRequest
1 голос
/ 10 июня 2019

Я не использовал 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) их поддерживает.

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

Какой запрос я могу написать, чтобы правильно разбить этот набор дубликатов?

...