配对在单个Sql查询中花费最长时间

时间:2014-02-24 20:47:14

标签: mysql sql algorithm sql-date-functions

我有一个包含以下列的长表:

Id(串行),FirstName(varchar15),LastName(varchar15),StartDate(日期),EndDate(日期)

,条目如下:

* 1, Amar, XoXo, 2009-07-01, 2014-05-23.
* 2, Madhujita, Mami, 2009-03-11, 2014-06-24.
* 3, Akbak Ladar, 2000-04-12, 2009-01-01.
* 4, Abhashuk, Genjin, 2005-06-03, 2005-09-09.
* 5, Sinra, Iao, 2014-01-01, 2014-04-06

等等,直到500名成员。

我怎样才能找出哪两个人在一起度过的最多时间和多少天? 就像给定的数据一样,Amar和Madhujita花了最多的时间。 这可以在一个查询中完成吗? 谢谢。

2 个答案:

答案 0 :(得分:1)

假设每人有一行,这是两个跨度之间重叠的问题。以下查询使用MySQL语法执行此操作(MySQL支持least()greatest()limit)。这几乎可以在任何数据库中完成,但确切的语法可能会有所不同:

select lt1.firstname, lt1.lastname, lt2.firstname, lt2.lastname,
       greatest(0, datediff(least(lt1.EndDate, lt2.EndDate), greatest(lt1.StartDate, lt2.StartDate))) as overlap
from LongTable lt1 cross join
     LongTable lt2
where lt1.id <> lt2.id
order by overlap desc
limit 1;

Here是一个证明它的SQL小提琴。

答案 1 :(得分:0)

Thanx Gordon,我跟着你的踪迹,自己提出了一个更好理解的问题

select x.firstname as firstname1,x.lastname as surname1,y.firstname as firstname2,y.lastname as surname2
            from staff x inner join staff y on 
            x.startDate <= y.endDate and y.startDate <= x.endDate and x.firstname!=y.firstname and x.surname!=y.surname HAVING MIN(ABS(DATEDIFF(x.startdate,x.endDate)-DATEDIFF(y.startDate,y.endDate)))