Comment comparer des dates pour de multiples rangées sous la même table et même compte
Si SQL gourous pourrait me diriger dans la bonne direction serait d'une grande aide. Je suis l'apprentissage du SQL et souhaitez créer un rapport qui permettrait de générer le Compte #s en vertu de la même Personne ID qui ont été créés <= 30 jours les uns des autres et exclure les autres. Toutes les informations nécessaires est dans la même table.
Par exemple ce code extrait d'une liste de Personne avec le même personid qui ont plus d'un Accountid et leur date de Création:
select accounttid, creationdate, personid from Table1 where personid in (
select (personid) from Table1 group by personid having COUNT (accountid) > 1)
EXAMPLE RESULT:
accountid creationdate personid
5501624 2013-05-01 101
5501544 2013-05-03 101
5510220 2013-10-24 10337
5504204 2013-06-27 10337
5502332 2013-05-21 1047
5502628 2013-05-28 1047
5508844 2013-10-01 1047
Vous ne savez pas où aller à partir d'ici. Je veux, puis de prendre ces Accountids et en quelque sorte comparer les Creationdates pour inférieur ou égal à 30 jours différentiel, mais seulement de les comparer lors de la PersonIDs sont les mêmes.
- Que voulez-vous dire exactement par
Account #s .... that were created <= 30 days of each other
? Dire qu'il y a 4 comptes (en vertu de la même personne), premier compte créé à2013-01-30
, deuxième à2013-02-28
, thid un à2013-03-25
et le quatrième au2013-04-15
. On peut dire qu'elles sont toutes<=30 days of each other
, qui enregistre voulez-vous obtenir ? Tous d'entre eux, ou les deux premiers enregistrements à partir de janvier + février, ou peut-être deux derniers enregistrements de mars+avril ? - Oui j'aurais besoin de retourner tous les quatre de ces n ° s chacun étant dans un délai de 30 jours à compter de l'autre. Par exemple, dans votre exemple, dire il y a 5 comptes et le 5e a été créé sur 2013-06-01 le script doit retourner les 4 premiers mais omettre le dernier car il n'est pas dans les 30 jours d'une autre. Et bien sûr, ce seraient tous sous le même PersonID.
Vous devez vous connecter pour publier un commentaire.
Je voudrais utiliser une semi-jointure:
démo --> http://www.sqlfiddle.com/#!2/2be93/2
--- EDIT ---
Sur SQL-Server utiliser cette condition:
voici une requête SQL-Server:
démo: ----> http://www.sqlfiddle.com/#!3/cc922/4
Une remarque à votre requête:
pense un certain temps ..... la sous-requête avec
HAVING COUNT
doit calculer un certain nombre de dossiers pour chaque personne - il faut lire l'ensemble du tableau (toutes les lignes) pour obtenir cette information, parce que nous avons demandégive me a number of rows for given person
. Si cette personne a 10.000 comptes, nous avons besoin de lire tous les compter.Cependant, nous n'avons pas besoin de cette information et nous n'avons pas besoin de lire l'ensemble de la table. Ce dont nous avons besoin est la réponse à cette question:
if this person has at least 2 accounts
.Pour ce genre de requêtes, nous pouvons utiliser un
EXISTS
opérateur:Dans cette requête MySql n'a pas besoin de compter tous les dossiers et n'a pas besoin de lire l'ensemble de la table. Il arrête la lecture de la table quand il trouve d'abord l'enregistrement qui répond aux critères définis par la sous-requête à l'intérieur EXISTE opérateur.
BETWEEN dateadd( day, -30, t2.creationdate ) AND dateadd( day, 30, t2.creationdate )
, j'ai ajouté une requête avec une démo de SQL-Server dans ma réponse. Veuillez également modifier la balise demysql
àsql-server
dans la question.Probablement, vous pouvez rejoindre le résultat que vous avez obtenu pour lui-même basé sur la condition que
personid
doit être la même et la différence entre les deuxcreationdate
s est supérieure à 30 jours.Quelque chose comme: