web-dev-qa-db-fra.com

sélectionner des lignes dans sql avec la dernière date pour chaque identifiant répété plusieurs fois

J'ai une table où chaque ID est répété 3 fois. il y a une date devant chaque identifiant dans chaque rangée.
Je veux sélectionner la ligne entière pour chaque ID où la date est la plus récente. Il y a au total 370 colonnes dans ce tableau. Je veux que toutes les colonnes soient sélectionnées lorsque je sélectionne cette ligne.

Échantillon -

ID   Name    Date        Marks    ..    ..  ..   
1     XY     4/3/2017     27
1     fv     4/3/2014     98
1     jk     4/3/2016     09
2     RF     4/12/2015    87
2     kk     4/3/2009     56
2     PP     4/3/2011     76
3     ee     4/3/2001     12
3     ppp    4/3/2003     09
3     lll    4/3/2011     23

La réponse devrait être 

ID   Name    Date        Marks    ..    ..  ..   
1     XY     4/3/2017     27      
2     RF     4/12/2015    87
3     lll    4/3/2011     23  

J'essaye comme ci-dessous - 

select distinct ID,*,max(date) as maxdate from table

Aussi j'essaye ceci dans la ruche. donc pas sûr que certaines fonctions SQL ne fonctionnent pas dans Hive

Merci

3
Earthshaker

Cette question a déjà été posée. S'il vous plaît voir this question.

En utilisant la réponse acceptée et en l’adaptant à votre problème, vous obtenez:

SELECT tt.*
FROM myTable tt
INNER JOIN
    (SELECT ID, MAX(Date) AS MaxDateTime
    FROM myTable
    GROUP BY ID) groupedtt 
ON tt.ID = groupedtt.ID 
AND tt.Date = groupedtt.MaxDateTime
11
ecarlin

Une façon est:

select table.* 
from table
join 
(
    select ID, max(Date) as max_dt 
    from table
    group by ID
) t
on table.ID= t.ID and table.Date = t.max_dt 

Notez que si vous avez plusieurs dates égales pour un même ID, vous obtiendrez toutes ces lignes dans le résultat.

3
Oto Shavadze

Avez-vous essayé ce qui suit:

SELECT ID, COUNT(*), max(date)
FROM table 
GROUP BY ID;
0
milton

Vous pouvez le faire avec une sous-requête corrélée (c'est-à-dire une sous-requête dans laquelle vous référencez un champ dans la requête principale). Dans ce cas:

SELECT * 
FROM yourtable t1
WHERE date = (SELECT max(date) from yourtable WHERE id = t1.id)

Ici, nous donnons à la table yourtable un alias de t1, puis nous utilisons cet alias dans la sous-requête qui extrait la max(date) de la même table yourtable pour cette id

0
JNevill

Vous pouvez utiliser une jointure pour le faire

SELECT t1.* from myTable t1
LEFT OUTER JOIN myTable t2 on t2.ID=t1.ID AND t2.`Date` > t1.`Date`
WHERE t2.`Date` IS NULL;

Seules les lignes ayant la dernière date pour chaque ID avec une jointure nulle à t2.

0
RichGoldMD

Voici un moyen. La requête interne obtient la date maximale pour chaque identifiant. Ensuite, vous pouvez relier cela à votre table principale pour obtenir les lignes qui correspondent.

select
*
from
<your table>
inner join 
(select id, max(<date col> as max_date) m
where yourtable.id = m.id
and yourtable.datecolumn = m.max_date)
0
Andrew