我有一个表,其中有一个与ID相关联的日期时间:
┌────────────────┬──────────────────────┐
│ 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行,所以快速运行的建议的加分:)
发布于 2010-03-05 08:43:06
你可以试一试
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替换为您需要的。
发布于 2010-03-05 08:47:27
我希望这对你有用:
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);
https://stackoverflow.com/questions/2385426
复制