2009-09-24 4 views
3

Je dois donc extraire les adresses e-mail des membres qui ne se sont pas connectés sur mon site au cours des 30 derniers jours. Puisque le site a plus de quelques années, nous voulons tirer seulement une poignée de chaque membre de certains trimestres de l'année. Ainsi, par exemple, environ 800 000 personnes ne se sont pas connectées au cours des 30 derniers jours.(SQL) Extraction de données spécifiques à partir d'une grande liste où certaines dates tombent dans un trimestre spécifique

Nous voulons donc tirer 300 000 utilisateurs de cette liste, mais nous voulons diviser l'échantillon sur trois ans. Trois ans a douze trimestres. 300 000/12 = 25 000.

Je veux tirer 25 000 par rapport au T1 2007

25 000 par rapport au T2 2007

25 000 par rapport au T3 2007

25 000 par rapport au T4 2007

25 000 par rapport au T1 2008

etc ....

Aurais-je besoin d'écrire des requêtes pour chaque 'quertar' puis de les unir ou y a-t-il un moyen de les faire toutes dans une même requête?

SELECT Email, lastlogindate 
FROM Users 
WHERE DATEDIFF(dd, LastLoginDate, GetDate()) > 30 

C'est la requête de base que je dois tirer toutes les données.

Je veux essentiellement éviter d'avoir à écrire 12 requêtes avec les clauses where comme:

DATEPART(q, LastLoginDate) = 1 AND 
DATEPART(yyyy, LastLoginDate) = 2007 

toute aide serait grandement appréciée.

+0

+1, vous frappez 1k! –

Répondre

5

essayer quelque chose comme ceci:

SELECT 
    Email,LastLoginDate 
    FROM (SELECT 
       Email,LastLoginDate 
        ,ROW_NUMBER() OVER(PARTITION BY DATEPART(year,LastLoginDate),DATEPART(quarter,LastLoginDate) ORDER BY LastLoginDate) AS Rank 
       FROM Users 
       WHERE LastLoginDate < GetDate()-30 
        AND LastLoginDate > GetDate()-(3*365) 
     ) dt 
    WHERE Rank<25000 

EDIT
a changé la WHERE dans le tableau dérivé de mieux utiliser un index sur LastLoginDate

pour vérifier que tout fonctionne, vous pouvez les ajouter à la liste extérieure SELECT:

,DATEPART(year,lastchgdate) as Year,DATEPART(quarter,lastchgdate) AS Quarter,rank 

et ajouter un ORDER BY:

ORDER BY Year,Quarter,rank 
+0

Voter: c'est ce que je voulais dire, mais était paresseux pour taper sql. – AlexS

+0

J'adore ce foutu site. Merci beaucoup! –

+0

Je l'ai utilisé avant votre édition. Je me demandais, pourquoi le LastLoginDate> GetDate() - (3 * 365) par opposition à faire DATEPART (aaaa, LastLoginDate) <= 3 –

1

Vous pouvez utiliser ranking function(s) pour atteindre votre objectif:

  1. Calculer pour chaque ligne « numéro de quartier » (donc quarts de vous laps de temps sont numérotées avec des valeurs consécutives).
  2. groupe vous des lignes en fonction de la valeur « numéro de trimestre »
  3. de rang Calculer de chaque ligne dans le groupe
  4. Filtrer les enregistrements basés sur la valeur de rang

Vous avez terminé.

Questions connexes