如何将表格拆分为一组唯一的值,以及另一组剩余的重复项

时间:2019-06-10 11:58:44

标签: sql oledb

我已经好几年没有使用SQL了,这个问题超出了我。 我在用oledb连接器查询的Excel工作表中有一组带日期的条目。如果某些字段(例如,名称,电子邮件和水果)与另一个条目匹配,则将它们视为重复项。但是它们还有其他可能是唯一的字段。

我需要处理该集合,以便拥有:

(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)

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

到目前为止,我已经能够获得

(a)一组唯一的条目

(b)一组所有重复项

但是我一直在写一个查询,给定(b)将从每个组中提取最早的Date并将其添加到(a)(因此创建我需要的第一个输出集)。我假设无论该查询是什么,我都可以从(b)中减去其结果以得到剩余的重复项。

(对不起,我试图包括创建测试表的SQL,但是当包含SO时,则将该帖子标记为垃圾邮件,并且不允许我发布)

这是我用来获取一组唯一条目(a)的查询:

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

和反向查询以获取重复项(b):

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)支持它们。

我觉得我已经接近了,我只需要正确地查询重复的集合,并将其与唯一的集合相结合/从自身中减去它即可得到最终结果。

我可以写什么查询来正确地拆分那组重复项?

0 个答案:

没有答案