2010-09-16 4 views
2

Я группирую некоторые записи по их близости времени. Что я могу сделать прямо сейчас (проставлены в UnixTime),Эффективный способ разделения группы на отдельные записи

Во-первых, я сделать саб выбора, чтобы захватить записи, которые представляют интерес меня,

(SELECT timestamp AS target_time FROM table WHERE something = cool) AS subselect 

Тогда я хочу посмотреть на записи, которые близки в срок до тех,

SELECT id FROM table, subselect WHERE ABS(target_time - timestamp) < 1800 

Но вот где я ударил свою проблему. Мне нужны только записи, где разница во времени между записями вокруг target_time составляет> 20 минут. Поэтому для этого я группирую target_time и добавляю раздел HAVING.

SELECT id FROM table, first WHERE ABS(target_time - timestamp) < 3600 
GROUP BY target_time HAVING MAX(timestamp) - MIN(timestamp) > 1200 

Это замечательно, и все записи, которые мне не нравятся ушли, но теперь у меня есть только первый id группы, когда я действительно хочу все ids. Я могу использовать GROUP_CONCAT, но это дает мне беспорядок, я больше не могу отвечать на запросы. Мне бы хотелось, чтобы все ids были возвращены из всех этих создаваемых групп. Нужно ли мне другое заявление SELECT? Или есть только лучший способ структурировать то, что я получил?

Спасибо,

SQL-шишка.

+0

Что именно вы хотите? Сначала вы говорите, что хотите сгруппировать по временному интервалу. Вы делаете это, а затем жалуетесь, что получаете только одну запись за группу, что и должна делать GROUP (и то, что вы сначала сказали, что хотите). Поэтому я немного смущен. – jira

+0

Извините, я предполагаю, что мой первоначальный вопрос изменился, когда я написал проблему. Реальная проблема заключается в том, что мне нужно сгруппировать записи, чтобы использовать агрегированные функции для удаления некоторых, которые мне не нужны. Но тогда мне нужно де-группа? мои записи, поэтому я могу получить доступ к идентификаторам по отдельности. И я не знаю, насколько это эффективный метод. Я сделаю быстрое редактирование, спасибо. –

ответ

0

Мое предположение вы хотите вывод, который выглядит следующим образом:

id1, timestamp1, fieldA, fieldB 
    id1, timestamp2, fieldA, fieldB 
    id2, timestamp3, fieldA, fieldB 
    id2, timestamp4, fieldA, fieldB 
    id3, timestamp5, fieldA, fieldB 
    id3, timestamp6, fieldA, fieldB 

но метка времени для этих записей между 1200 и 1800 секунд из «target_time» где-то = круто?

SELECT data.id, data.timestamp, data.fieldA, data.fieldB, ..., data.fieldX 
    FROM events 
    JOIN data 
    WHERE events.something = cool_event -- Gives the 'target_time' of cool_event 
     AND ABS(event.timestamp - data.timestamp) BETWEEN 1200 and 1800 -- gives data records 'near' target time, but at least 20 minutes away. 

ЕСЛИ «данные» и таблицы «событий», одни и те же таблицы, а затем просто использовать имена псевдонимов таблиц, но вы можете присоединиться к столу, к самому себе, так называемый "автообъединение.

SELECT data.id, data.timestamp, data.fieldA, data.fieldB, ..., data.fieldX 
    FROM events AS target, events AS data 
    WHERE target.something = cool_event -- gives the 'target_time' of cool_event 
     AND ABS(target.timestamp - data.timestamp) BETWEEN 1200 and 1800 -- gives data records 'near' target time, but at least 20 minutes away. 

Это звучит правильно и без каких-либо групп или агрегатов.

При необходимости вы можете получить результирующие данные.

- J Йоргенсон -

+0

Это не совсем то, что мне нужно. Допустим, что целевое время - полночь. Мне нужны все записи от 11: 30-12: 30. Но скажем, когда я получаю эти записи, единственные в то время - от 11: 56-12: 05. Время, которое они растягивают, недостаточно долго. Таким образом, я хочу, чтобы идентификаторы всех записей вокруг целевых времен, когда группа возвращалась, растягиваются более чем на 20 минут. Смущаю, что знаю. (Отсюда и щедрость). Спасибо хоть! –

1

Смотрите, если у меня есть ваша проблема правильно:

Для данной строки в таблице, вы хотите знать, набор строк для аналогичных записей, если диапазон временных меток для этих записей больше 20 минут. Вы хотите это для всех идентификаторов в таблице.

Если вы просто хотите получить список идентификаторов, которые отвечают этим критериям, она довольно проста:

дана таблица, как:

create table foo (id bigint(4), section VARCHAR(2), modification datetime); 

вы можете сделать:

select id, foo.section, min_max.min_modification, min_max.max_modification, abs(min_max.min_modification - min_max.max_modification) as diff 
from foo, 
(select section, max(modification) max_modification, min(modification) min_modification from foo as inner_foo group by section) as min_max 
where foo.section = min_max.section 
and abs(min_max.min_modification - min_max.max_modification) > 1800; 

You «сделать подзапрос, основанный на критериях« похожих строк »(в данном случае разделе столбца), чтобы получить минимальную и максимальную отметки времени для этого раздела. Этот min и max применяются ко всем идентификаторам в этом разделе. Следовательно, для раздела «А» у вас будет список идентификаторов, то же самое для раздела «В».

Смежные вопросы