代码之家  ›  专栏  ›  技术社区  ›  Amar

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

  •  0
  • Amar  · 技术社区  · 12 年前

    我有一个长表,列如下:

    Id(序列号)、名字(varchar15)、姓氏(varchar5)、开始日期(日期)、结束日期(日期

    条目如下:

    * 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 回复  |  直到 12 年前
        1
  •  1
  •   Gordon Linoff    12 年前

    假设每人有一行,这是两个跨度之间的重叠问题。以下查询使用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 Fiddle演示它。

        2
  •  0
  •   Amar    12 年前

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