2017-03-24 1 views
1

En SQL, j'essaie d'extraire la première et la deuxième date d'une table. J'utilise la requête ci-dessous que j'ai formulée en fonction d'un certain nombre de messages sur le même sujet, à savoir l'extraction de la deuxième date, etc. Mais pour une raison quelconque, je ne comprends pas pourquoi.Première et deuxième date de la table dans SQL

La table s'appelle motif_segmentvalue et elle a une colonne appelée EntryDate que je suis intéressé à utiliser pour extraire les dates. J'ai écrit une petite requête pour un utilisateur particulier 5407 pour voir si j'obtenais le bon résultat ou non.

select sv2.UserId, sv2.EntryDate, min(sv2.EntryDate) 
from motif_segmentvalue sv2 
where sv2.EntryDate > (select MIN(sv3.EntryDate) from motif_segmentvalue sv3) 
and sv2.UserId = "5407" 

La sortie que je reçois est:

UserId EntryDate    min(sv2.EntryDate) 

    5407 2016-01-20 12:50:00 2016-01-20 12:50:00 

Sur la base de mes données, ce qui est faux et la colonne « EntryDate » devrait avoir une date différente de min (sv2.EntryDate) - il devrait avoir la deuxième date. Mais pour une raison quelconque, ce n'est pas le cas. Je ne peux pas comprendre ce que je fais mal. Quelqu'un peut-il donner des conseils sur ce que je pourrais faire de façon incorrecte? Est-ce que je m'attends à ce que "EntryDate" soit la deuxième date?

J'ai également essayé beaucoup d'autres utilisateurs et les deux colonnes donnent la même date.

Merci

+0

Avez-vous essayé en utilisant la clause ORDER '' BY' et LIMIT' pour 2 lignes seulement –

+0

Eh oui ... je reçois le même résultat. L'objectif final est d'exécuter ceci sur toute la base de données pour tous les utilisateurs que j'ai et limiter ne fonctionne pas là, il retourne juste le premier utilisateur ... –

Répondre

1

absolue Je pense que cela vous obtiendra ce que vous voulez.

Il a une date 01/01/2050 comme sauvegarde quand il n'y a pas deuxième date

select sv2.UserId, min(sv2.EntryDate) as first 
, min(if(sv2.EntryDate=mindate,'2050-01-01', sv2.EntryDate)) as second 
from motif_segmentvalue sv2 
join (
    select sv3.UserId, min(sv3.EntryDate) as mindate 
    FROM motif_segmentvalue sv3 
    WHERE sv3.UserId = "5407" 
) as temp ON temp.UserId = sv2.UserId 
WHERE sv2.UserId = "5407" 

mise à jour: Cela ira chercher la deuxième date, au lieu de la datetime suivante.

select sv2.UserId, min(sv2.EntryDate) as first 
, min(if(date(sv2.EntryDate)=mindate,'2050-01-01', sv2.EntryDate)) as second 
from motif_segmentvalue sv2 
join (
    select sv3.UserId, min(date(sv3.EntryDate)) as mindate 
    FROM motif_segmentvalue sv3 
    WHERE sv3.UserId = "5407" 
) as temp ON temp.UserId = sv2.UserId 
WHERE sv2.UserId = "5407" 
+0

Je viens de le mettre à jour. Je l'ai créé avec MAX à l'esprit, mais vu par la suite, je devrais utiliser MIN :) – Johan

+0

Great! Merci, fonctionne parfaitement ... Juste une question ... Et si j'ai un utilisateur qui a plusieurs fois pour la même date ... donc pour '5407' j'ai deux fois à cette date, y at-il un moyen de passer à juste la prochaine date et pas seulement le prochain point de temps? –

+0

Vous pouvez envisager de changer '2050-01-01' à null ... probablement aucune requête que nous écrivons aujourd'hui durera 30 ans, mais vous ne savez jamais :) –

-1

Essayez ceci:

SELECT * FROM motif_segmentvalue sv2 
WHERE sv2.UserId = "5407" 
ORDER BY EntryDate ASC 
LIMIT 2 
+0

'Top' ne fonctionne pas dans mon mysql ... J'ai essayé limite 2 après l'ordre par mais je ne comprends toujours pas la bonne chose. J'ai besoin d'une colonne qui liste la deuxième date ... –

+1

Pour MySQL, je crois que LIMIT est utilisé, plutôt que TOP – Degan

+0

@Degan yup .. essayé ... –

0

Si je comprends bien, je construis cette requête en quelques étapes.

Tout d'abord, obtenir le minimum

select UserId, min(EntryDate) 
from motif_segmentvalue 
where UserId = "5407" 
group by UserId 

ensuite obtenir le minimum suivant (en utilisant la requête ci-dessus)

select UserId, min(EntryDate) 
from motif_segmentvalue 
where UserId = "5407" and 
     EntryDate > (
      select UserId, min(EntryDate) 
      from motif_segmentvalue 
      where UserId = "5407" 
      group by UserId 
     ) 
group by UserId 

Enfin rejoindre les deux

select t1.UserId, t1.min_1, t2.min_2 
from (
      select UserId, min(EntryDate) as min_1 
      from motif_segmentvalue 
      where UserId = "5407" 
      group by UserId 
     ) t1 
join (
      select UserId, min(EntryDate) as min_2 
      from motif_segmentvalue 
      where UserId = "5407" and 
        EntryDate > (
         select UserId, min(EntryDate) 
         from motif_segmentvalue 
         where UserId = "5407" 
         group by UserId 
        ) 
      group by UserId 
     ) t2 
on  t1.UserId = t2.UserId