3

次のクエリがあります

select t1.file_name, 
       max(create_date), 
       t1.id 
 from dbo.translation_style_sheet AS t1 
GROUP BY t1.file_name

選択にIDを追加したいのですが、これを行うたびに、グループ化された結果ではなくすべての結果が返されます

私の目標は戻ることです

pdf | 10/1/2012 | 3
doc | 10/2/2012 | 5

しかし、私のクエリは返されます

pdf | 9/30/2012 | 1
pdf | 9/31/2012 | 2
pdf | 10/1/2012 | 3
doc | 10/1/2012 | 4
doc | 10/2/2012 | 5

私が間違っていることを知っている人はいますか?

4

2 に答える 2

4

max(create_date)の行にも最大の値があることが保証されているid場合 (サンプル データにはありますが、それがアーティファクトかどうかはわかりません)、単に選択することができますmax(id)

select t1.file_name, max(create_date), max(t1.id) 
  from dbo.translation_style_sheet AS t1 
 GROUP BY t1.file_name

それが保証されておらず、返されるid行の値がmax(create_date)必要な場合は、分析関数を使用できます。以下は Oracle で機能しますが、Derby のようなあまり洗練されていないデータベースでサポートされる可能性は低いです。

select t1.file_name, t1.create_date, t1.id
  from (select t2.file_name,
               t2.create_date,
               t2.id,
               rank() over (partition by t2.file_name 
                                order by t2.create_date desc) rnk
          from dbo.translation_style_sheet t2) t1 
  where rnk = 1

サブクエリを使用することもできます。これは移植性が高くなる可能性がありますが、分析関数アプローチよりも効率的ではありません。

select t1.file_name, t1.create_date, t1.id
  from dbo.translation_style_sheet t1
 where (t1.file_name, t1.create_date) in (select t2.file_name, max(t2.create_date)
                                            from dbo.translation_style_sheet t2
                                           group by t2.file_name);

また

select t1.file_name, t1.create_date, t1.id
  from dbo.translation_style_sheet t1
 where t1.create_date = (select max(t2.create_date) 
                           from dbo.translation_style_sheet t2
                          where t1.file_name = t2.file_name);
于 2012-10-26T20:20:58.430 に答える
1

GROUP BY を使用している場合、集計関数で使用されていないすべてのフィールドをグループに含める必要があります。

select t1.file_name, max(create_date), t1.id from 
dbo.translation_style_sheet AS t1 GROUP BY t1.file_name, t1.id
于 2012-10-26T20:13:45.540 に答える