2017-08-10 5 views
0

Sur SQL Server 2014, j'ai une table visits(id_visit, date, id_person) je ne peux pas trouver un moyen d'obtenir le id_ de la dernière visite pour chaque personne dans une fonction d'agrégationGroupe par une fonction d'agrégation dans

ne sais pas vraiment si il peut aider, mais ici est un peu ce que je voudrais avoir

select * 
from visits 
where id_visit in (select id_visit, max(date) from visits group by id_person) 

Si j'avais comme des visites (id_visit, id_person, date) 1,1, « 17.07.2017 » 2,1 , '2017-01-01' 3,2, '2016-01-01' 4,2, '2015-01-01' 5,2, '2013-01-01' je voudrais qu'il revienne 1,3,5

+0

Ajouter des données de table d'échantillons et le résultat attendu - sous forme de texte formaté. – jarlh

Répondre

1

Vous pouvez utiliser ROW_NUMBER:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY id_person ORDER BY date DESC) AS rn 
    FROM visits 
) 
SELECT * 
FROM cte 
WHERE rn = 1; 

Il retournera la dernière visite par personne.

+0

On dirait que ça marche, et comment voulez-vous introduire ça si j'avais des clauses et des clauses dans ma main où? –

+0

@BastienMorel Just andd après 'rn = 1 ET ...' – lad2025

-1

Vous avez besoin de plus subselect:

SELECT * 
    FROM visits 
WHERE id_visit IN (SELECT id_visit 
         FROM visits 
        WHERE date IN (SELECT max(date) 
             FROM visits 
            GROUP BY id_person)) 
+0

c'est ce que je pensais mais je n'ai pas réussi à le faire correctement merci –

+0

fait-il ce que vous voulez? alors peut-être marquer comme anwer; D – RealCheeseLord

+0

j'ai un problème à gauche, si j'ai un et b visitant à la même date puis b visitant plus tard, il me montrera les deux visites de b tandis que je veux seulement le deuxième à apparaître –