2017-07-28 11 views
0

私は各IDが3回繰り返されるテーブルを持っています。各行の各IDの前に日付があります。
日付が最新のIDごとに行全体を選択したいとします。 この表には合計370の列があります。その列を選択すると、すべての列が選択されます。各IDの最新の日付が複数回繰り返されたsqlの行を選択

サンプル -

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

はまた、私はハイブでこれをしようとしています - 私は以下のようにしようとしています

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

回答があるべき

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 

。ので、いくつかのSQL関数はハイブにいけない仕事

おかげかどうかわからない

+0

同様の質問がhere- https://stackoverflow.com/questions/13523049/hive-sql-find-the回答されています-latest-record/43528852#43528852 –

答えて

1

この質問は以前に聞かれました。 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 
+0

最後の行のように見えますが、tt.Date = groupedtt.MaxDateTime ....ありがとう – Earthshaker

+0

確かです。あなたが答えが好きなら、upvoteと受け入れられた答えとして選択してください。 – ecarlin

2

一つの方法は次のとおりです。あなたが同じIDに対して複数の均等に高いの日付を持っている場合、あなたはそれらすべてを取得すること

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 

注意

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

はい。確かにthats '起こっています...それから私はデータベース全体から重複した行を削除することができます...そして、それらの複数の行が消えて、各idに対して1行だけになります。 – Earthshaker

0

は、次を試してみました相関サブクエリ(これはメインクエリのフィールドを参照するサブクエリです)でこれを行うことができます。この場合:

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

ここでは、yourtableテーブルにt1のエイリアスを与え、そのidのために同じテーブルyourtableからmax(date)をつかんサブクエリでそのエイリアスを使用しています。

+1

これは、そのIDが最大の日付のレコードのテーブルのすべてのフィールドを返しません。 – JNevill

0

あなたはNULLがT2に参加していると、各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; 

行だけを行うために参加を使用することができます。

+0

古い学校。ニース。 – Strawberry

+0

これは私に、両方の左右のエイリアスがJOIN 'date'に遭遇したというエラーを与えています – Earthshaker

+0

mysqlが報告しているエラーですか?私はそれが問題だが、日付は予約語なので、私はバックティックで私の答えを更新したのか分からない。 – RichGoldMD

0

ここには1つの方法があります。内部クエリは各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) 
関連する問題