select t1.file_name,
max(create_date),
t1.id
from dbo.translation_style_sheet AS t1
GROUP BY t1.file_name
我想将id添加到select中,但每次执行此操作时,它都会返回所有结果而不是我的分组结果
我的目标是回归
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
谁知道我做错了什么?
解决方法:
如果您确保具有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
如果不能保证,并且您希望返回来自具有max(create_date)的行的id值,则可以使用分析函数.以下内容适用于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);