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 回答