我有一张表格,其中我的日期时间与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行,因此快速运行的建议的奖励积分:)
答案 0 :(得分: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
然后用你需要的东西替换id。
答案 1 :(得分: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);