检查多行的值,仅返回MAX / MIN行

时间:2013-10-04 02:35:25

标签: sql sql-server tsql

我正在尝试编写一个查询,该查询将比较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,我想我错过了一些基本的尝试。

2 个答案:

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

关于聚合函数的更多here。 关于分组的更多here

答案 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)