2010-03-05 34 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);