2012-01-20 4 views
0

У меня есть таблица с этой схемой:запросов SQL получение группы из двух или более аналогичных строк

enter image description here

Контекст люди, которые путешествуют в тот же день и почти тот же час.

Что мне нужно, чтобы получить из него:
группы людей, которые имеют аналогичную дату (2 +/- часов макс различию) то же самое место и того же типа, и они должны появиться два или более раз вместе с что сдерживает.

На изображении выше Джон и Стив должны появиться в результатах, поскольку они делят все реквизиты для запроса.

Заранее спасибо.

+0

Эта проблема, похоже, требует возможности группировки по каждой записи и поиска строк, находящихся в пределах одной единственной записи. Но опять же, если вы используете произвольное медианное время, это становится еще более сложным. Что нужно сделать, может быть, больше объяснять точные логические требования для каждой «группы». –

+0

Какие RDBMS (Oracle, SQLServer, MySQL и т. Д.) Это? Функции даты/операторы различаются между СУБД, поэтому это повлияет на ответ. –

+0

И ЧТО ТЫ ИСКЛЮЧАЛИ? – JNK

ответ

1

Кулак всего, переместите таблицу на SQLServer 2008, как вы говорите. Затем этот запрос может помочь вам для групп 2-х человек:

select t1.pesonId as Person1, t2.personId as Person2 
from 
    yourTable as t1 
    inner join 
    yourTable as t2 
    on 
     t2.PersonId > t1.PersonId and --to avoid t1,t2 and t2,t1 
     t2.Place = t1.Place and 
     t2.Type = t1.type and 
     t2.date between dateadd(hh, -2, t1.date) and dateadd(hh, +2, t1.date) 
group by 
    t1.pesonId, t2.personId 
having count(*) > 1 --more than one time as you say 

Затем этот запрос может помочь вам для групп 3-х человек:

select t1.pesonId as Person1, t2.personId as Person2,, t3.personId as Person3 
from 
    yourTable as t1 
    inner join 
    yourTable as t2 
    on 
     t2.PersonId > t1.PersonId and 
     t2.Place = t1.Place and 
     t2.Type = t1.type and 
     t2.date between dateadd(hh, -2, t1.date) and dateadd(hh, +2, t1.date) 
    inner join 
    yourTable as t3 
    on 
     t3.PersonId > t2.PersonId and 
     t3.Place = t1.Place and 
     t3.Type = t1.type and 
     t3.date between dateadd(hh, -2, t1.date) and dateadd(hh, +2, t1.date) 
group by 
    t1.pesonId, t2.personId, t3.personId 
having count(*) > 1 --more than one time as you say 

У меня есть tested first query in data taking Post as your table, здесь де-результаты :

Person1 Person2  
------- ------- --- 
22656 23354 584 
22656 29407 237 
22656 23283 230 
22656 69083 189 
22656 57695 178 
157882 203907 177 
26428 131527 175 
20862 131527 163 
22656 34397 159 
22656 65358 150 

(10 row(s) affected) 

для более сложного анализа, я предлагаю вам использовать SSAS или перейти к инструменту Datamining как knime.

+0

Рассмотрите записи в 00:00, 01:00 и 04:00. Все они +/- 2 часа с 2 утра, но не будут возвращены этим запросом. – MatBailie

+0

Почему бы и нет? @Dems, '00:00 между 02: 00-2h и 02: 00 + 2h' =' 00:00 между 00:00 и 04: 00' = true! – danihp

+1

Еще один ярлык ... поскольку они хотят другого человека, вместо того, чтобы делать personA! = PersonB (который даст вам результаты для PersonA, PersonB и PersonB, PersonA), измените его на PersonA DRapp

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