2010-08-09 63 views
1

我怎麼會選擇不同的用的名字姓氏的所有行類似的行(在某些列相等)和那裏的重複選擇一個具有較高SomeDate,那麼Id如果仍然重複例如如何篩選出基於其他列的數據

爲:

 
| Id | Forename | Surname | SomeDate | 
---------------------------------------- 
| 1 | Bill  | Power | 2011-01-01 | 
| 2 | James | Joyce | 2011-02-01 | 
| 3 | Peter | Lennon | 2011-03-01 | 
| 4 | John  | Sellers | 2011-04-01 | 
| 5 | James | Joyce | 2011-05-01 | 
| 6 | Peter | Lennon | 2011-03-01 | 

結果:

 
| Id | Forename | Surname | SomeDate | 
---------------------------------------- 
| 1 | Bill  | Power | 2011-01-01 | 
| 4 | John  | Sellers | 2011-04-01 | 
| 5 | James | Joyce | 2011-05-01 | 
| 6 | Peter | Lennon | 2011-03-01 | 

我怎麼會在

  1. T-SQL
  2. 從一個DataTable使用C#實現這個

回答

2

假設的SQL Server 2005+,使用方法:

SELECT x.id, 
     x.forename, 
     x.surname, 
     x.somedate 
    FROM (SELECT t.id, 
       t.forename, 
       t.surname, 
       t.somedate, 
       ROW_NUMBER() OVER (PARTITION BY t.forename, t.surname 
             ORDER BY t.somedate DESC, t.id DESC) AS rank 
      FROM TABLE t_ x 
WHERE x.rank = 1 

有風險的做法是:

SELECT MAX(t.id) AS id, 
     t.forename, 
     t.surname, 
     MAX(t.somedate) AS somedate 
    FROM TABLE t 
GROUP BY t.forename, t.surname 
1

我傾向於使用子查詢的不分組的值。

SELECT Forename, Surname, 
    (SELECT TOP 1 Id FROM myTable mt WHERE mt.Forename = m.Forename AND mt.Surname = m.Surname 
    ORDER BY m.SomeDate DESC) AS Id 
    (SELECT TOP 1 SomeDate FROM myTable mt WHERE mt.Forename = m.Forename AND mt.Surname = m.Surname 
    ORDER BY m.SomeDate DESC) AS SomeDate 
FROM myTable m 
GROUP BY Forename, Surname 

或者你可以在WHERE子句中過濾它:

SELECT Id, Forename, Surname, SomeDate 
FROM myTable m 
WHERE m.Id = (SELECT TOP 1 Id FROM myTable mt WHERE mt.Forename = m.Forename AND mt.Surname = m.Surname 
    ORDER BY m.SomeDate DESC) 

恐怕也不會是非常有效的,但指數色調將ameliate,如果需要的。

對於一個數據表的例子,你會做基本相同的事情。

var recs = from record in dataTable 
      where record.Id == 
       (from rec in dataTable 
       where rec.Forename == record.Forename && rec.Surname == record.Surname 
       orderby rec.SomeDate descending 
       select rec.Id).First() 
      select record;