我有桌子: 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条结果)。
此致
答案 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版本需要另一个步骤才能将其缩小到一行。
这是另一个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