2010-10-18 8 views
0

Je ne sais pas si le terme tri est le plus approprié mais de toute façon j'ai un grand ensemble de données qui se compose des colonnes userA, userB, date, interactionDuration. En d'autres termes, l'ensemble de données contient des lignes qui décrivent quels utilisateurs interagissaient, combien de temps l'interaction a duré et la date de l'interaction. L'objectif est de diviser ces interactions en une logique pertinente et non pertinente ou importante et sans importance: si l'interaction est longue, nous supposons qu'elle est importante et si elle est courte, elle est accidentelle et «non pertinente». D'un autre côté, si les deux mêmes personnes interagissent souvent (chaque jour ou chaque semaine) et chaque événement si l'interaction ne dure pas longtemps, nous supposons qu'elle est importante parce qu'elle n'est pas accidentelle. Les données sont stockées dans MS SQL Server 2008 et je me demande s'il est possible de calculer l'intervalle (en jours) entre les interactions de paires distinctes de personnes en utilisant des requêtes SQL ou s'il est nécessaire d'écrire une routine personnalisée . Quoi qu'il en soit, je serais très reconnaissant d'entendre toute suggestion sur la façon d'effectuer un tri qui divise les paires en groupes par le nombre d'interactions, durées d'interaction et les intervalles entre les interactions - est-il possible de calculer des périodes entre deux enregistrements consécutifs (trié par date), puis sélectionnez le groupe de paires qui ont interagi communément et/ou pendant longtemps en utilisant uniquement des requêtes SQL ou est-il nécessaire d'écrire un algorithme personnalisé?Algorithme de tri pour les grands ensembles de données

edit1

Ce sont des lignes par exemple:

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 

Quelle est la meilleure façon de trier les enregistrements ci-dessus en fréquence (rareté) des interactions? Est-il possible de le trier en utilisant des requêtes sql?

Merci!

+0

Désolé, mais demandez-vous quelles requêtes écrire ou comment les écrire - je suis un peu confus? – Kane

+0

Merci pour le commentaire Kane. J'ai essayé de clarifier la question.Le but est de trier l'enregistrement en utilisant l'approche la plus appropriée et de ne pas savoir s'il est préférable ou possible de sélectionner des sous-groupes en utilisant uniquement des requêtes ou si l'écriture d'un algorithme de tri personnalisé est nécessaire. –

Répondre

1

Si je vous comprends bien, compte tenu de ces données (10 premières lignes):

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 

Vous voulez savoir quels utilisateurs ont interagi souvent ou pendant une longue période dans une période donnée. Je suppose que vous utilisez MS SQL Server 2005 ou version ultérieure.

Plus de 10 conversations dans une période allant de 3 à 7 jours:

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 

L'instruction WITH calcule, pour chaque paire d'utilisateurs, les dates de leurs interactions, sans tenir compte de multiples interactions pendant la journée. Ceci est notre base de référence pour trouver des conversations après cette date qui répondent aux conditions que nous fixons. Ceci est exprimé par le "Stamp> = dt", qui signifie "montrer les contacts qui ont des interactions après le contact".

Plus de 2 minutes en 4 jours:

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

Je suggère d'utiliser des fonctions analytiques dans une sous-requête pour déterminer les intervalles de date, puis trier les résultats de la fonction analytique dans la requête externe.

Questions connexes