Если я вас правильно понимаю, учитывая эти данные (первые 10 строк):
User1 User2 Stamp Duration (secs)
d g 09/01/2010 20
b g 13/01/2010 37
c k 29/01/2010 15
c k 12/01/2010 39
e h 27/01/2010 33
b i 23/01/2010 46
b g 04/01/2010 44
b k 05/01/2010 12
b k 02/01/2010 9
Вы хотели бы знать, какие пользователи взаимодействовали часто или в течение длительного времени в течение определенного периода.Я предполагаю, что вы используете MS SQL Server 2005 или более позднюю версию.
Более 10 разговоров за период от 3 до 7 дней:
WITH Contact(u1, u2, dt) AS (
SELECT DISTINCT
user1, user2, stamp
FROM
Interactions
)
SELECT
u1, u2, dt as FirstConversation, MAX(stamp) as LastConversation,
COUNT(Duration) AS conversations
FROM
Interactions INNER JOIN Contact
ON user1 = u1 AND User2 = u2 AND Stamp >= dt
GROUP BY
u1, u2, dt
HAVING
COUNT(duration) > 10 AND
DATEDIFF("d", MIN(stamp), MAX(stamp)) BETWEEN 3 and 7
ORDER BY
1, 2, 3
Оператор WITH рассчитывает для каждой парыпользователей, даты их взаимодействий, игнорируя множественные взаимодействия в течение дня.Это наша базовая линия для поиска разговоров ПОСЛЕ той даты, которые отвечают установленным нами условиям.Это выражается как «Штамп> = DT», что означает «показать контакты, которые взаимодействуют после контакта».
Более 2 минут в течение 4 дней:
WITH Contact(u1, u2, dt)AS (
SELECT DISTINCT
user1, user2, stamp
FROM
Interactions
)
SELECT
u1, u2, dt as FirstConversation, MAX(stamp) as LastConversation,
SUM(Duration) AS timespent
FROM
Interactions INNER JOIN Contact
ON user1 = u1 AND User2 = u2 AND Stamp >= dt
GROUP BY
u1, u2, dt
HAVING
SUM(Duration) > 120 AND
DATEDIFF("d", MIN(stamp), MAX(stamp)) BETWEEN 0 and 4
ORDER BY
1, 2, 3
HTH