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

Jam*_*uss 4 sql t-sql sql-server

我正在尝试编写一个查询,它将比较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
Run Code Online (Sandbox Code Playgroud)

和查询:

SELECT key, name, value, MAX(date)
FROM myTable
WHERE key IN (1,2,3,4)
Run Code Online (Sandbox Code Playgroud)

我期待着回归

key  | name  | value |   date
 1   | frank |  100  | 1/1/2013
 2   | peter |  200  | 2/1/2013
 4   | jonny |  300  | 4/1/2013
Run Code Online (Sandbox Code Playgroud)

我不确定如何使用GROUP BY,我想我错过了一些基本的尝试.

Mic*_*ael 8

好吧,如果你只想要最新的行,你可以使用以下内容:

SELECT TOP 1 key, name, value, date
FROM myTable
ORDER BY date desc
Run Code Online (Sandbox Code Playgroud)

这应该返回该表中最新日期的一行.

如果您想要每个名称的最新日期,您可以使用group by:

SELECT name, max(date)
FROM myTable
WHERE key in(1,2,3,4)
GROUP BY name
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这稍微复杂一些,因为您希望返回的列不包含在分组中.因此,两个陈述到达最终结果集.

最终选项:良好的老式子查询.

 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
Run Code Online (Sandbox Code Playgroud)

更多有关集合函数.更多有关团体.