SQL GROUP BY одно поле и список последних значений двух других полей одновременно - PullRequest
0 голосов
/ 14 декабря 2010

Примите во внимание эти данные:

id      firstname   lastname    registration_date
101126423   foo         bar     2010-06-17 13:31:00.000
101126423   foo         bar     2010-06-17 13:31:00.000
101126423   foo         bar jr  2010-06-18 12:13:00.000
101152718   john        doe     2010-02-26 19:08:00.000
101152718   john        doe     2010-02-26 19:08:00.000
101152718   john        doe     2010-02-26 19:08:00.000

У вас могут быть клиенты с таким же id, но с другим firstname / lastname!Я хочу получить все отдельные идентификаторы, но с последним именем / фамилией (на основе регистрационной даты).

Для моего примера я получу:

id      firstname   lastname
101126423   foo         bar jr
101152718   john        doe

ПокаЯ получил:

SELECT DISTINCT id, firstname, lastname
FROM member

, но он явно не работает ... Я пробовал другие запросы безуспешно.Может быть, having может помочь мне, но я никогда не использовал его ...

Я использую SQL Server 2008 в этом проекте.

1 Ответ

1 голос
/ 14 декабря 2010

Пара вариантов для вас:

Вариант 1:

;with cte as(
  select id, max(registration_date) lastReg
  from member
  group by id
)
select distinct m.id, m.firstname, m.lastname
from member m
  join cte c on m.id=c.id
            and m.registration_date = c.lastReg

Вариант 2:

;with cte as(
  select id, firstname, lastname,
         row_number() over(partition by id order by registration_date desc) as 'order'
  from member
)
select id, firstname, lastname
from cte
where order = 1

Самое большое различие между ними в отношении ихРезультаты, как они обрабатывают случай, когда самое последнее время регистрации дублируется для идентификатора с несколькими именами.В этом случае вариант 1 будет возвращать оба имени, которые имеют самую последнюю дату регистрации, а вариант 2 будет возвращать только одно (случайным образом).Примером этого случая является (небольшое изменение ваших данных выборки):

id          firstname   lastname    registration_date
101126423   foo         bar         2010-06-17 13:31:00.000
101126423   foo         bar         2010-06-18 12:13:00.000
101126423   foo         bar jr      2010-06-18 12:13:00.000
101152718   john        doe         2010-02-26 19:08:00.000
101152718   john        doe         2010-02-26 19:08:00.000
101152718   john        doe         2010-02-26 19:08:00.000

--Option 1 result:
id          firstname   lastname
101126423   foo         bar
101126423   foo         bar jr
101152718   john        doe

--Option 2 result (possibility 1):
id          firstname   lastname
101126423   foo         bar
101152718   john        doe

--Option 2 result (possibility 2):
id          firstname   lastname
101126423   foo         bar jr
101152718   john        doe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...