Алгоритм сортировки для больших наборов данных - PullRequest
0 голосов
/ 18 октября 2010

Я не знаю, является ли термин сортировка наиболее подходящим, но в любом случае у меня есть большие наборы данных, которые состоят из столбцов userA, userB, date, InteractionDuration.Другими словами, набор данных содержит строки, которые описывают, какие пользователи взаимодействовали, как долго длилось взаимодействие и какова дата взаимодействия.

Цель состоит в том, чтобы разделить это взаимодействие на релевантное и не относящееся к делу или важное и неважное, а также следующеелогика: если взаимодействие долгое, мы считаем его важным, а если оно коротким, оно случайное и «неактуальное».С другой стороны, если одни и те же два человека взаимодействуют часто (каждый день или каждую неделю) и событие, если одиночное взаимодействие не длится долго, мы предполагаем, что оно важно, потому что оно не случайно.

Данные хранятсяв MS SQL Server 2008, и мне интересно, можно ли каким-то образом вычислить интервал (в днях) между взаимодействиями различных пар людей, используя SQL-запросы, или необходимо написать собственную подпрограмму.

В любом случаеЯ был бы очень благодарен за любые предложения о том, как выполнить сортировку, которая делит пары на группы по количеству взаимодействий, продолжительности взаимодействия и интервалам между взаимодействиями - возможно ли рассчитать временные интервалы между двумя последовательными записями (отсортированы по дате)а затем выберите группу пар, которые обычно и / или долгое время взаимодействовали, используя только SQL-запросы, или необходимо написать собственный алгоритм?

edit1

Это примеры строк:

user_A                                      user_B                                      interaction_duration    interaction_date_date
00002781A2ADA816CDB0D138146BD63323CCDAB2    0E3F0A58C6BD5202D1B0D4D4F6A0B05E7A156AC7    532                     2010-09-04
00002781A2ADA816CDB0D138146BD63323CCDAB2    47DFCA60C7D2D9B32ACBE650BCBA53F3DA57CB7B    29                      2010-09-15
00002781A2ADA816CDB0D138146BD63323CCDAB2    8F4ADF3CC26905AF69F930C546954D87DB536E24    83                      2010-09-04
00002781A2ADA816CDB0D138146BD63323CCDAB2    8F4ADF3CC26905AF69F930C546954D87DB536E24    10                      2010-09-01
00002D2354C7080C0868CB0E18C46157CA9F0FD4    372BD190F61BAACDFA2512B71B0C62BCD654D5D1    50                      2010-09-23
00002D2354C7080C0868CB0E18C46157CA9F0FD4    372BD190F61BAACDFA2512B71B0C62BCD654D5D1    105                     2010-09-18
00002D2354C7080C0868CB0E18C46157CA9F0FD4    372BD190F61BAACDFA2512B71B0C62BCD654D5D1    44                      2010-09-08
00002D2354C7080C0868CB0E18C46157CA9F0FD4    372BD190F61BAACDFA2512B71B0C62BCD654D5D1    50                      2010-09-04
00002D2354C7080C0868CB0E18C46157CA9F0FD4    372BD190F61BAACDFA2512B71B0C62BCD654D5D1    21                      2010-09-02

WhНаилучший способ сортировки вышеуказанных записей по частоте (редкости) взаимодействий?Можно ли отсортировать его с помощью SQL-запросов?

Спасибо!

Ответы [ 2 ]

1 голос
/ 18 октября 2010

Если я вас правильно понимаю, учитывая эти данные (первые 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

0 голосов
/ 18 октября 2010

Я предлагаю использовать аналитические функции в подзапросе для определения интервалов дат, а затем сортировать результаты аналитической функции во внешнем запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...