我正在尝试编写一个查询,该查询将比较N行数的值,并仅返回具有最大值的行。例如,如果我只想返回一个包含非重复行的表,而只返回具有最新日期的行 -
key | name | value | date
1 | frank | 100 | 1/1/2013
2 | peter | 200 | 2/1/2013
3 | jonny | 300 | 3/1/2013
4 | jonny | 300 | 4/1/2013
查询:
SELECT key, name, value, MAX(date)
FROM myTable
WHERE key IN (1,2,3,4)
我希望这会回来
key | name | value | date
1 | frank | 100 | 1/1/2013
2 | peter | 200 | 2/1/2013
4 | jonny | 300 | 4/1/2013
我不确定如何使用GROUP BY,我想我错过了一些基本的尝试。
答案 0 :(得分:8)
如果您只想要最新的行,可以使用以下内容:
SELECT TOP 1 key, name, value, date
FROM myTable
ORDER BY date desc
这应返回该表中最新日期的一行。
如果您想要每个名称的最新日期,可以使用group by:
SELECT name, max(date)
FROM myTable
WHERE key in(1,2,3,4)
GROUP BY name
Max是一个聚合函数。无论何时使用聚合函数,都必须在group by子句中指定任何未聚合的列。
所以根据您的预期结果您可能想要这样:
;with namesWithMaxDate as(
select
name
,max(date) as date
from
myTable
group by
name
)
select
myTable.[key]
,myTable.name
,myTable.value
,myTable.date
from myTable
inner join
namesWithMaxDate
on
myTable.name = namesWithMaxDate.name and
myTable.date = namesWithMaxDate.date
这稍微复杂一些,因为您希望返回的列未包含在分组中。因此,两个陈述到达最终结果集。
最终选项:良好的老式子查询。
select
myTable.[key]
,myTable.name
,myTable.value
,myTable.date
from myTable
inner join
( select
name
,max(date) as date
from
myTable
group by
name ) as namesWithMaxDate
on
myTable.name = namesWithMaxDate.name and
myTable.date = namesWithMaxDate.date
答案 1 :(得分:2)
试试这个:
SELECT a.key, a.name, a.value, a.date
FROM myTable a
WHERE a.key IN (1,2,3,4)
and
a.DATE = (select MAX(date) from myTable b where a.key = b.key)