2011-07-20 29 views
2

基于LastCreatedDate互不相同的名字我有列示例表:如何选择SQL

ID(guid)         Name  CreatedDate 

B27EB95B-B219-46BD-9E72-A378B3E7FED0 A  2005-11-20 22:49:46.000 
33D43825-918D-4DC0-874A-53670563EA03 A  2009-10-03 10:34:00.000 
28F26DA6-B144-4C0C-AC2F-4DDD2D74357E B  2011-03-23 08:08:39.000 
1491D95F-BA58-41EE-8982-B713DE9DECD7 C  2006-01-18 14:53:12.000 
FD25C05D-0C1A-4314-BCA7-F4F33B0E890D C  2006-10-05 14:25:58.000 
F4256300-CAA6-4E80-8D1B-B89273274088 D  2008-03-12 08:56:32.000 

这应该是我在SSIS OledbDatasource。

现在的问题是我需要得到不同的名称具有最后createdDate和它在sql中的Id。

这是输出结果:(变更表表中的实际名称)

ID(guid)         Name  CreatedDate 

33D43825-918D-4DC0-874A-53670563EA03 A  2009-10-03 10:34:00.000 
28F26DA6-B144-4C0C-AC2F-4DDD2D74357E B  2011-03-23 08:08:39.000 
047ED9C3-DF92-45D5-B295-EE52184116FB C   2006-10-05 14:23:40.000 
F4256300-CAA6-4E80-8D1B-B89273274088 D  2008-03-12 08:56:32.000 

谢谢问候

回答

1
SELECT ID, Name, CreatedDate 
FROM table JOIN 
    (SELECT MAX(CreatedDate) CreatedDate, Name FROM table GROUP BY Name) max_date 
USING (Name, CreatedDate) 

对于SQLServer的事:

SELECT table.ID, table.Name, table.CreatedDate 
FROM table JOIN 
    (SELECT MAX(CreatedDate) CreatedDate, Name FROM table GROUP BY Name) max_date 
ON table.Name = max_date.name AND table.CreatedDate = max_date.CreatedDate 
+0

这不适用于我的SQL Server实例。你测试了什么? –

+0

它是通用SQL,我没有在SQL Server上测试它。 SQL Server是否支持加入子查询? – Ariel

+1

SQL Server不支持'JOIN ... USING'。 –

2

如果你的SQL Server 2005或更高版本,可以使用rankingCTE

WITH ranked AS (
    SELECT 
    ID, Name, CreatedDate, 
    rn = ROW_NUMBER() OVER (PARTITION BY Name ORDER BY CreatedDate DESC) 
    FROM atable 
) 
SELECT 
    ID, 
    Name, 
    CreatedDate 
FROM ranked 
WHERE rn = 1 
+0

+1 - 这实际上比我的CROSS APPLY解决方案更有效率。为了完整性,我会在这里留下我的答案。 –

0

这将产生你想要SQL Server上的结果:

select distinct x.ID, x.Name, x.CreatedDate 
from table t 
    cross apply (
     select top 1 ID, Name, CreatedDate 
     from table t1 
     where t1.Name = t.Name 
     order by CreatedDate desc 
    ) x 
order by x.Name; 
1

尝试了这一点

SELECT myTable.Id, myTable.Name, myTable.CreatedDate 
FROM table as myTable 
INNER JOIN (SELECT Name, MAX(CreatedDate) AS MaxDate FROM table GROUP BY Name) 
    AS MaxRecord ON MaxRecord.Name = myTable.Name 
       AND MaxRecord.MaxDate= myTable.CreatedDate 
+0

我一直使用这个更复杂的版本,它的工作原理 – Matt

+0

对不起,但它与@ Ariel的解决方案有何不同? –

+0

这不是。当我开始写回复时,他的回应的那部分不在那里。正如你所指出的那样,他只有加入使用方法,它不被sql server支持。 – Matt