2010-03-24 8 views
2

J'ai une table comme suitNombre de dossiers consécutifs

> RowID SessionID  EventID RequestedURL Date 
> 1  m2jqyc45g  1  Start   24/03/2010 19:52 
> 2  m2jqyc45g  1  ProductPage 24/03/2010 19:52 
> 3  m2jqyc45g  28  BuyNow   24/03/2010 19:52 
> 4  tjmvb55dc4dg 1  ProductPage 24/03/2010 19:52 
> 5  tjmvb55dc4dg 1  BuyNow   24/03/2010 19:56 
> 6  tjmvb55dc4dg 1  Clicked OK  24/03/2010 19:56 
> 7  m2jqyc45g  1  Clicked OK  24/03/2010 19:56 
> 8  tjmvb55dc4dg 28  Help   24/03/2010 19:56 
> 9  m2jqyc45g  1  Home   24/03/2010 19:56 
> 6  m2jqyc45g  1  ProductPage 24/03/2010 19:56 
> 7  tjmvb55dc4dg 1  BuyNow   24/03/2010 19:56 
> 8  tjmvb55dc4dg 28  Clicked OK  24/03/2010 19:56 
> 9  tjmvb55dc4dg 1  Home   24/03/2010 19:56 

Comment puis-je écrire une requête qui fait un nombre chaque fois que les lignes AchatImmédiat et cliqué sur OK ont été enregistrées consécutivement à une séance particulière? Par exemple, l'ensemble de données ci-dessus montre deux utilisateurs sur le site qui enregistrent des sessions distinctes. Le nombre de retour doit être 3.

Je suis en cours d'exécution SQL Server 2008

EDIT Juste pour clarifier ce que je veux dire par lignes consécutives et pourquoi le comptage doit revenir 3. Dans la session m2jqyc45g, le AchatImmédiat et Cliqué Ok apparaît consécutivement dans la session mais quand il est entré dans la table, il y a aussi d'autres sessions simultanées qui cassent la séquence. Si vous deviez trier les résultats par SessionID puis par Date, vous les obtiendrez les uns après les autres. En outre, il y avait une faute de frappe avec RowID7, ProductPage devrait être BuyNow. Désolé.

+0

Comment diable puis-je aligner les colonnes bien avec les en-têtes ??? – super9

+1

Pourquoi le compte serait-il de 3? Il n'y a que 2 BuyNow. – DyingCactus

+0

vous devez expliquer comment ordonner correctement les lignes dans vos données d'échantillon - toutes ces actions se produisent-elles réellement dans la même seconde? En outre, vous pourriez avoir besoin de définir plus clairement ce que vous entendez par "consécutivement" si vous attendez vraiment 3 en conséquence. –

Répondre

3
SELECT COUNT(*) 
FROM yourTable y 
WHERE RequestedURL = 'BuyNow' 
    AND Exists (SELECT * 
      FROM yourTable x 
      WHERE x.RowID = (SELECT MIN(RowID) 
           FROM yourTable z 
           WHERE z.SessionID = y.SessionID 
           AND z.RowID > y.RowID) 
       AND RequestedURL = 'Clicked') 

Cela devrait le faire. Il pourrait y avoir un moyen plus rapide, mais je ne suis pas sûr de ce que vous pouvez faire d'autre. En outre, vous voudrez probablement mais des index sur RowID et SessionID.

Votre autre option consiste à utiliser des expressions de table communes pour obtenir les ID de ligne groupés par session et par heure. Le ci-dessous pourrait le faire pour vous.

WITH temp AS (
SELECT 
    SessionID, 
    RequestedURL, 
    [Date], 
    RN = ROW_NUMBER() OVER (ORDER BY SessionID,[Date]) 
FROM yourTable 
ORDER BY SessionID,[Date]) 
SELECT 
    COUNT(*) 
FROM temp x 
    JOIN temp y ON x.SessionID = y.SessionID 
     AND x.RN = y.RN - 1 
WHERE x.RequestedURL = 'BuyNow' 
    AND y.RequestedURL = 'Clicked' 
+0

Je ne pense pas que cela répondra à l'exigence - voir la session 'm2jqyc45g' dans les données de l'échantillon –

+0

D'accord, je l'ai corrigé. Il devrait faire exactement ce qu'il cherche maintenant. –

+0

ne fonctionne pas j'ai peur. quoi de neuf avec le "1 = ....." – super9

Questions connexes