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

时间:2017-07-28 20:16:20

标签: 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

答案应该是

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

我正在尝试如下 -

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

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

由于

6 个答案:

答案 0 :(得分:14)

之前已经问过这个问题。请参阅this问题。

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

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

答案 1 :(得分:3)

一种方法是:

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 

请注意,如果您有相同ID的多个同等更高的日期,那么您将获得结果

中的所有这些行

答案 2 :(得分:0)

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

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

在这里,我们为yourtable表提供了t1的别名,然后在子查询中使用该别名从同一个表max(date)抓取yourtable id }}。

答案 3 :(得分:0)

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

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;

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

答案 4 :(得分:0)

这是一种方式。内部查询获取每个id的最大日期。然后,您可以将其连接回主表以获取匹配的行。

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)

答案 5 :(得分:-1)

您是否尝试过以下操作:

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