我有一张表,其中每个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中不起作用
由于
答案 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;