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
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
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.
Avez-vous essayé ce qui suit:
SELECT ID, COUNT(*), max(date)
FROM table
GROUP BY ID;
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
.
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.
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)