web-dev-qa-db-ja.com

SQLで行を選択し、各IDの最新の日付を複数回繰り返します

各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で機能しないかどうかは不明です

ありがとう

13
Earthshaker

この質問は以前に尋ねられました。 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
11
ecarlin

1つの方法は次のとおりです。

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に同じ日付の日付が複数ある場合は、結果としてそれらすべての行が取得されます。

3
Oto Shavadze

以下を試しましたか?

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

これは、相関サブクエリで実行できます(これは、メインクエリのフィールドを参照するサブクエリです)。この場合:

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

ここでは、yourtableテーブルに_t1_のエイリアスを指定し、そのエイリアスをサブクエリで使用して、同じテーブルyourtableからmax(date)を取得しますid

0
JNevill

結合を使用してこれを行うことができます

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へのNULL結合があります。

0
RichGoldMD

ここに一つの方法があります。内部クエリは、各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)
0
Andrew