t-sql Aggregate Max

时间:2010-09-02 07:56:34

标签: tsql sql-server-2008 aggregate-functions

我有桌子:     CREATE TABLE [dbo]。[test](       [name] nvarchar(max)NULL,       [date] datetime NULL     )

并记录下来:

a 2010-09-02 12:00:00 
a 2010-09-02 11:00:00 
b 2010-09-02 12:00:00 
b 2010-09-02 11:00:00

我希望得到最新日期的所有名字:

我可能会这样做:

select t.[name] from test t
group by t.[name]
having max(date) = (select MAX(DATE) from test where [name] = t.[name])

有一个问题 - 我无法获得约会

我可能会这样做:

select t.* 
    from test t
    where t.[date] = (select MAX(DATE) from test where [name] = t.[name])

没有任何问题

我的问题是: 我可以做得更好吗?我将从表增量表中获取大约10,000条记录(每天更多10,000条结果)。

此致

2 个答案:

答案 0 :(得分:2)

这将选择不同的名称以及与每个名称相关联的最新日期:

select t.[name], MAX(t.[date]) 
from test t
group by t.[name]

使用GROUP BY时,您还可以在SELECT子句中对不属于分组的列使用聚合函数。

来自MSDN(Aggregate Functions):

  

聚合函数经常与SELECT语句的GROUP BY子句一起使用。

答案 1 :(得分:2)

什么版本的SQL Server?

SQL 2005及以上版本:

SELECT *
FROM
   (SELECT Item = Row_Number() OVER (PARTITION BY [name] ORDER BY [date] DESC), * FROM test) X
WHERE Item = 1

SQL 2000:

SELECT T.*
FROM
   test T
   INNER JOIN (
      SELECT [name], MaxDt = Max([date]) FROM test GROUP BY [name]
   ) X ON T.[name] = X.[name] AND T.[date] = X.MaxDt

如果您可以有重复的日期,那么sql 2000版本需要另一个步骤才能将其缩小到一行。

@Oded指出你可以简单地获得最大日期。如果你需要的只是名字和日期,那么他的查询是最好的。但如果我怀疑你需要同一行的更多项目,那么你需要这样的查询。

这是另一个SQL 2005版本:

SELECT
   T.*
FROM
   test T
   CROSS APPLY (
      SELECT TOP 1 [date]
      FROM test T2
      WHERE T.[name] = T2.[name]
      ORDER BY T2.[date] DESC
   ) X
WHERE
   T.[date] = X.[date]

此查询将出现同名重复最长日期

的问题

<强>更新

现在我知道它是SQL 2008:

row_number()解决方案最简单,最简单。我从那开始。如果性能不够,并且表是父表的子节点,每个[name]只有一次,请尝试使用外部表(测试T)作为父表的CROSS APPLY解决方案:

SELECT
   X.*
FROM
   Parent P
   CROSS APPLY (
      SELECT TOP 1 *
      FROM test T
      WHERE P.[name] = T.[name]
      ORDER BY T.[date] DESC
   ) X

如果没有父表,您可以尝试上述查询或使用SELECT DISTINCT [name] FROM test,但我不相信这会带来性能提升:

SELECT
   X.*
FROM
   (SELECT DISTINCT [name] FROM test) P
   CROSS APPLY (
      SELECT TOP 1 *
      FROM test T
      WHERE P.[name] = T.[name]
      ORDER BY T.[date] DESC
   ) X