5

我正在尝试编写一个查询,该查询将比较 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,我认为我在尝试它时遗漏了一些基本的东西。

4

2 回答 2

10

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

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

更多关于聚合函数的信息更多关于分组的信息

于 2013-10-04T02:46:23.537 回答
3

试试这个:

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)
于 2013-10-08T10:59:08.607 回答