2016-08-21 1 views
0

J'ai un tableau comme suit:Sélection de valeurs distinctes de la base de données

ParentActivityID | ActivityID | Horodatage

1    A1   T1 
2    A2   T2 
1    A1   T1 
1    A1   T5 

Je souhaite sélectionner ParentActivityID unique avec Timestamp. L'horodatage peut être le plus récent ou le premier comme cela se produit dans le tableau.

J'ai essayé d'utiliser DISTINCT mais je me suis rendu compte qu'il ne fonctionnait pas sur des colonnes individuelles. Je suis nouveau à SQL. Toute aide à cet égard sera grandement appréciée.

Répondre

0

DISTINCT est un raccourci qui fonctionne pour une seule colonne. Lorsque vous avez plusieurs colonnes, utilisez GROUP BY:

SELECT ParentActivityID, Timestamp 
FROM MyTable 
GROUP BY ParentActivityID, Timestamp 

En fait, je ne veux qu'une seule une ParentActivityID. Votre solution donnera chaque paire de ParentActivityID et Timestamp. Par exemple, si j'ai [1, T1], [2, T2], [1, T3], alors j'ai voulu que la valeur soit [1, T3] et [2, T2].

Vous devez décider des nombreux horodatages à choisir. Si vous voulez plus tôt un, utilisez MIN:

SELECT ParentActivityID, MIN(Timestamp) 
FROM MyTable 
GROUP BY ParentActivityID 
+0

Merci pour la réponse. En fait, je veux seulement un ParentActivityID. Votre solution donnera chaque paire de ParentActivityID et Timestamp. Pour e.g, si j'ai [1, T1], [2, T2], [1, T3], alors je voulais que la valeur soit [1, T3] et [2, T2]. – Varun

0

« Groupe par » est ce que vous avez besoin. Il suffit de faire « groupe par ParentActivityID » et dire que l'horodatage le plus récent sur toutes les lignes avec la même ParentActivityID est nécessaire pour vous:

SELECT ParentActivityID, MAX(Timestamp) FROM Table GROUP BY ParentActivityID 

« Groupe par » l'opérateur est comme prendre des lignes d'une table et de les mettre dans une carte avec une clé définie dans la clause group by (ParentActivityID dans cet exemple). Vous devez définir comment le groupement va gérer les lignes avec des clés en double. Pour cela, vous avez diverses fonctions d'agrégat que vous spécifiez sur les colonnes que vous voulez sélectionner mais qui ne font pas partie de la clé (non répertoriées dans la clause group by, considérez-les comme des valeurs dans une carte).

Certaines bases de données (comme mysql) vous permettent également de sélectionner des colonnes qui ne font pas partie de la clause group by (pas dans une clé) sans leur appliquer une fonction d'agrégat. Dans ce cas, vous obtiendrez une valeur aléatoire pour cette colonne (cela revient à écraser aveuglément la valeur dans une carte avec une nouvelle valeur à chaque fois). Pourtant, la norme SQL avec la plupart des bases de données ne vous permettra pas de le faire. Dans ce cas, vous pouvez utiliser la fonction d'agrégation min(), max(), first() ou last() pour la contourner.

0

Essayez ceci:

SELECT [ParentActivityId], 
     MIN([Timestamp]) AS [FirstTimestamp], 
     MAX([Timestamp]) AS [RecentTimestamp] 
FROM [Table] 
GROUP BY [ParentActivityId] 

Cela vous fournira le premier horodatage et la plus récente horodatage pour chaque ParentActivityId qui est présent dans votre table. Vous pouvez choisir ceux dont vous avez besoin selon vos besoins.

0

Utilisez CTE pour obtenir la dernière ligne de votre table en fonction de l'ID parent et vous pouvez choisir les colonnes de la ligne entière de la sortie.

;With cte_parent 
As 
    (SELECT ParentActivityId,ActivityId,TimeStamp 
      , ROW_NUMBER() OVER(PARTITION BY ParentActivityId ORDER BY TimeStamp desc) RNO 
    FROM YourTable) 

SELECT * 
FROM cte_parent 
WHERE RNO =1