2016-10-12 15 views
-1

複数のレコードを持つ各IDに基づいてmax(date)に基づいてすべてのレコードを表示したいとします。たとえば、id = 1のレコードが5個あり、id = 2のレコードが3個あるとします。私は最大(日付)を持つすべてのレコードを表示したいだけです。複数のレコードを持つIDに基づいてmax(date)を表示

id  date    name 
1  15-oct-2017  raj 
2  14-aug-2017  abc 
3  19-aug-2016  789 

以下のように

id  date    name 
1  15-sep-2016  hari 
1  15-oct-2017  raj 
1  15-sep-2015  xyz 
2  14-aug-2017  abc 
2  14-jun-2016  123 
3  19-aug-2016  789 
3  17-aug-2015  fff 

は、私は上記のクエリ「your_table_name」はあなたに

+1

質問を改善するのに役立つ[質問]と[mcve]を構築する方法 – Aleksej

答えて

0
select id, date_field, name from your_table_name primary_table where date_field = (
    SELECT MAX(date_field) from your_table_name AS secondary_table where primary_table.id = secondary_table.id GROUP BY secondary_table.id 
) GROUP BY primary_table.id order by primary_table.id 

に感謝レコードを表示したいあなたのテーブルの名前で、DATE_FIELDはの列名ですユーザーあたりの最大日付を調べる必要があるテーブルの日付の列。

+0

次のエラーが表示される "ORA-00979:GROUP BYの式ではない 00979 - 00000 - GROUP BY式ではありません " –

+0

ありがとうございます。その作業.. –

+0

私は、あなたがそれを変更する必要がある場合は、Oracleのクエリが必要な場合は、mysqlクエリを追加しました...ありがと... –

2

一つの方法は、以下のことができる:

select * 
from (
     select id, name, "date", row_number() over(partition by id order by "date" desc) as RN 
     from yourTable 
    ) 
where RN = 1 

、内側問合せはdate descに基づいて、すべての行のROWNUMBERを計算します。外部のものは、最初の位置の日付を持つ行を与えるだけです。つまり、各値が最大でdateの行がidになります。

さておき、あなたはより良い要件のこのタイプは、サブクエリなしで解決することができるようにあなたの列のdate

0
with max_dt 
as 
(
select t1.* 
,dense_rank() over (partition by id order by date desc) rnk 
from table1 t1 
) 
select id,date,name from max_dt 
where rnk=1 
0

として予約語を使用しないでくださいとおり:

select id, max(dt) as dt, 
      max(name) keep (dense_rank last order by dt) as name 
from table_name 
group by id 
order by id; 

は予約を使用しないでください問題の原因となる列名の単語(「日付」)。

関連する問題