Как отфильтровать похожие строки (равные по определенным столбцам) на основе данных других столбцов - PullRequest
1 голос
/ 10 августа 2010

Как мне выбрать все строки, отличные от Имя и Фамилия , и там, где есть дубликат, выбрать ту, которая имеет более высокий 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. Из таблицы данных с использованием C #

Ответы [ 2 ]

2 голосов
/ 10 августа 2010

Предполагая 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 голос
/ 10 августа 2010

Я бы предпочел использовать подвыборы для не сгруппированных значений.

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)

Боюсь, что нибудет ужасно эффективным, но тонирование индекса уменьшит это, если необходимо.

Для примера с данными вы бы сделали по сути то же самое.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...