SQL-自联接表时避免重复

时间:2018-11-15 23:21:06

标签: sql

我目前正在尝试将一个表自身连接起来,以确定日期之间的差异。条目列出了具有不同ID的不同单元的属性。每次编辑条目时,它都会添加具有新属性的新条目,而不是重写它。我正在尝试查找开始日期或结束日期不同的所有条目。我可以找到日期更改的所有条目,但是会显示重复的内容,例如:

ID StartDate1 EndDate1 StartDate2 EndDate2
1 1/12/2018 1/15/2018 1/13/2018 1/16/2018
1 1/13/2018 1/16/2018 1/12/2018 1/15/2018

我的代码如下:
SELECT DISTINCT u1.ID, u1.FirstNight, u1.LastNight, u2.FirstNight, u2.LastNight FROM units u1 LEFT JOIN units u2 ON u2.ID = u1.ID WHERE ((u1.firstnight <> u2.firstnight) AND (u1.lastnight <> u2.lastnight)

我该如何删除重复的条目?
谢谢!

2 个答案:

答案 0 :(得分:1)

我认为您的查询本应具有

u2.ID != u1.ID

停止每一行连接到自己。

将该条件更改为:

u2.ID < u1.ID

每对仅返回1个版本。

答案 1 :(得分:0)

对于您想做的事情,没有简单的解决方案。您必须对字段的值进行一些调整才能获得所需的结果。

尝试此SQL代码

架构

create table dates (id int, first date, last date);

insert into dates (id, first, last) VALUES (1, '2018/03/11', '2018/5/11');
insert into dates (id, first, last) VALUES (1, '2018/08/11', '2018/10/11');
insert into dates (id, first, last) VALUES (1, '2018/03/25', '2018/09/16');
insert into dates (id, first, last) VALUES (1, '2018/02/25', '2018/04/16');

insert into dates (id, first, last) VALUES (2, '2018/05/10', '2018/08/09');
insert into dates (id, first, last) VALUES (2, '2018/09/15', '2018/07/18');

查询

SELECT id1, first1, last1, id2, first2, last2 FROM 
(

    SELECT distinct 

    d1.id id1, 
    d1.first first1, 
    d1.last last1, 
    d2.id id2, 
    d2.first first2, 
    d2.last last2,
    ROW_NUMBER() OVER(PARTITION BY (d1.first + d2.first)) rn

    FROM dates d1
    JOIN dates d2 ON d2.id = d1.id

    WHERE (d1.first <> d2.first) AND (d1.last <> d2.last)

) AS DataResult

WHERE rn = 1;

工作原理

  • 子查询选择所需的字段,
  • 但最后一个字段使用带有ROW_NUMBER()函数的“聚合窗口函数”。
  • 最后,计算按自联接表中的“首次日期的总和”划分的所有元素

  • 外部查询除了使用“行数”字段中计算为限制为1的行数之外,还选择要减去“行号”字段的所需字段。

这里是SQL Fiddle,要进行更多测试!