我已经好几年没有使用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)支持它们。
我觉得我已经接近了,我只需要正确地查询重复的集合,并将其与唯一的集合相结合/从自身中减去它即可得到最终结果。
我可以写什么查询来正确地拆分那组重复项?