2014-02-24 85 views
0

我有一個長桌下列:對花費時間最長的單個SQL查詢

ID(序列),名字(varchar15),姓氏(varchar15),起始日期(日期),結束日期(日期)

和條目是這樣的:

* 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花了最多時間。 這可以在單個查詢中完成嗎? 謝謝。

+0

有每人只有一排?你有嘗試過什麼嗎?你使用的是哪個數據庫? –

+0

它的'mysql和我在編寫查詢時相當糟糕。我已經找到了算法。 – Amar

回答

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小提琴證明它。

+0

它沒有給出正確的結果。 – Amar

+0

這次重疊值不同的結果仍然相同。我明白你在這裏想要達到的目標。我會改進結果並讓你知道它是否有效。 Thanx反正! – Amar

+0

@Amar。 。 。我添加了where子句並在SQL Fiddle上測試它。 –

0

感謝名單戈登,我也跟着你的蹤跡,並用自己的查詢登陸了更好的理解

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