Выберите самый длинный общий диапазон времени - PullRequest
5 голосов
/ 05 марта 2010

У меня есть таблица, в которой у меня есть время, связанное с идентификатором:

┌────────────────┬──────────────────────┐
│ 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(), но как бы я выбрал максимальное из минимальных значений datetime и минимальное из максимальных datetime?

О, и эта таблица содержит 19 000 000 строк, поэтому бонусные баллы за быстрые предложения:)

Ответы [ 2 ]

2 голосов
/ 05 марта 2010

Вы можете попробовать что-то

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

А затем просто замените идентификаторы на то, что вам нужно.

0 голосов
/ 05 марта 2010

Надеюсь, у вас все получится:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...