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

Mysql 在sql中选择重复多次的每个ID的最新日期行,mysql,sql,hive,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

我有一个表,每个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
我也在蜂箱里试这个。因此,不确定某些sql函数是否在配置单元中不起作用

谢谢

一个方法是:

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有多个同样高的日期,则会在结果中得到所有这些行。

是否尝试了以下操作:

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

可以使用相关子查询执行此操作,该子查询是在主查询中引用字段的子查询。在这种情况下:

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

在这里,我们给yourtable表一个别名t1,然后在子查询中使用该别名,从同一个表yourtable获取该id的maxdate。

您可以使用连接来完成此操作

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的最新日期的行才有空的t2联接。

这里有一种方法。内部查询获取每个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)

这个问题以前有人问过。请看问题

使用公认的答案并根据您的问题进行调整,您会得到:

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

对于id为max date的记录,此操作不会返回表中的所有字段。是..正是这样发生的。。。然后我想我可以从整个数据库中删除重复的行。。。然后,这些多行将消失,每个id将只有一行。老派。很好。这给了我一个错误,因为在JOIN'date'中遇到的左别名和右别名是mysql报告的错误吗?我不知道这是否是问题所在,但Date是一个reserver单词,所以我用反勾号更新了我的答案。我认为这是一个配置单元错误-我的代码是为MySQL编写的,在最后一行看起来应该是,tt.Date=groupedtt.MaxDateTime。。。。谢谢。如果您喜欢答案,请向上投票并选择作为接受答案。如果日期来自用户,而相同或以前的日期来自用户,该怎么办???这里已经回答了类似的问题-这是一种非常缓慢的方式。@MaksimKniazev我不同意。在本例中,MySQL的执行计划类似于聚合子查询上的显式内部联接。当数据量很大时,它会花费很长时间。