2011-07-20 60 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