在sql中选择具有最新日期的行,每个ID重复多次

Ear*_*ker 6 mysql sql hive

我有一个表,每个ID重复3次.每行中每个id前面都有一个日期.
我想为最新日期的每个ID选择整行.此表中共有370列我希望在选择该行时选择所有列.

样品 -

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
Run Code Online (Sandbox Code Playgroud)

答案应该是

ID   Name    Date        Marks    ..    ..  ..   
1     XY     4/3/2017     27      
2     RF     4/12/2015    87
3     lll    4/3/2011     23  
Run Code Online (Sandbox Code Playgroud)

我正在尝试如下 -

select distinct ID,*,max(date) as maxdate from table
Run Code Online (Sandbox Code Playgroud)

我也是在Hive中尝试这个.所以不确定某些sql函数是否在Hive中不起作用

谢谢

eca*_*lin 26

之前已经问过这个问题.请看这个问题.

使用接受的答案并根据您的问题进行调整,您将获得:

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
Run Code Online (Sandbox Code Playgroud)


OTA*_*TAR 6

一种方法是:

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 
Run Code Online (Sandbox Code Playgroud)

请注意,如果您有多个相同 ID 的同样更高的日期,那么您将在结果中获得所有这些行


JNe*_*ill 5

您可以使用相关子查询(即引用主查询中的字段的子查询)来执行此操作。在这种情况下:

SELECT * 
FROM yourtable t1
WHERE date = (SELECT max(date) from yourtable WHERE id = t1.id)
Run Code Online (Sandbox Code Playgroud)

在这里,我们为该表指定yourtable一个别名t1,然后在子查询中使用该别名,max(date)从同一个表中yourtable获取该别名id


Ric*_*dMD 5

您可以使用联接来执行此操作

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;
Run Code Online (Sandbox Code Playgroud)

只有每个 ID 具有最新日期的行才具有与 t2 的 NULL 连接。