2010-08-09 66 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;