2010-03-05 31 views
5

我有,我有一個ID相關聯的日期時間的表:選擇最長的共同TIMERANGE

┌────────────────┬──────────────────────┐ 
│ location_id | datetime    | 
├────────────────┼──────────────────────┤ 
│ 200333   | 2008-01-01 00:00:00 | 
│ 200333   | 2008-01-01 01:00:00 | 
│ 200333   | 2008-01-01 02:00:00 | 
| ...   | ...     | 
│ 200333   | 2009-10-23 21:00:00 | 
│ 200333   | 2009-10-23 22:00:00 | 
│ 200333   | 2009-10-23 23:00:00 | 
│ 200768   | 2008-06-01 00:00:00 | 
│ 200768   | 2008-06-01 01:00:00 | 
│ 200768   | 2008-06-01 02:00:00 | 
| ...   | ...     | 
│ 200768   | 2009-12-31 00:00:00 | 
│ 200768   | 2009-12-31 00:00:00 | 
│ 200768   | 2009-12-31 00:00:00 | 
└────────────────┴──────────────────────┘ 

什麼是選擇最長的時間段這兩個重疊location_id的份額呢?在這種情況下,所需的輸出將是:

┌──────────────────────┬──────────────────────┐ 
│ start    | end     | 
├──────────────────────┼──────────────────────┤ 
│ 2008-06-01 00:00:00 | 2009-10-23 23:00:00 | 
└──────────────────────┴──────────────────────┘ 

我可以很容易地得到使用MIN()MAX()提供最長期限,但我將如何去選擇的最大日期時間的最大最小值日期時間的和最小?

哦,這個表包含19個000 000行,所以獎勵積分爲運行速度快:)

+1

有一個錯字在你期望的最終輸出:2009-10-23 23:00:00,而不是2008-10-23 23:00:00 ? – Patrick 2010-03-05 09:04:34

+1

@Patrick,是的,是一個錯字。 – 2010-03-05 09:13:28

回答

2

你可以試一下

SELECT MAX(MinDates) MaximumMinDate, 
     MIN(MaxDates) MinimumMaxDate 
FROM (
      SELECT location_ID, 
        MIN([datetime]) MinDates, 
        MAX([datetime]) MaxDates 
      FROM Table 
      WHERE location_ID IN (200333, 200768) 
      GROUP BY location_ID 
     ) sub 

然後只是你需要更換IDS建議。

+0

這工作正常,我不能看到一種方式如何可以進一步優化。我有點害怕使用子查詢,擔心會導致我的性能下降,但子查詢的運行速度與整個查詢速度相同,因此在那裏沒有問題。謝謝! – 2010-03-05 08:47:18

0

我希望這個作品出來你:

SELECT l1.maxtime, l2.mintime FROM 
(SELECT location_id, min(datetime), max(datetime) 
FROM table 
GROUP BY location_id 
) as l1(id, mintime, maxtime) 
, 
(SELECT location_id, min(datetime), max(datetime) 
FROM table 
GROUP BY location_id 
) as l2(id, mintime, maxtime) 
WHERE 
l1.id <> l2.id 
HAVING max(l1.maxtime-l2.mintime);