各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で機能しないかどうかは不明です
ありがとう
この質問は以前に尋ねられました。 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つの方法は次のとおりです。
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
からmax(date)
を取得しますid
。
結合を使用してこれを行うことができます
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結合があります。
ここに一つの方法があります。内部クエリは、各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)