SQL 2005: выберите top N, сгруппируйте по идентификатору с объединениями - PullRequest
2 голосов
/ 25 апреля 2010

У меня серьезные трудности с запросом, включающим 3 таблицы. Мне нужно получить 3 новых пользователя на отдел, сгруппированных по названиям отделов. Группы должны быть отсортированы по user.dateadded, чтобы отдел с новейшими действиями был первым. Пользователи могут существовать в нескольких отделах, поэтому я использую справочную таблицу, которая просто содержит userID и deptID. Мои таблицы следующие.

Отдел - depID | name

Пользователи - userID | name | dateadded

DepUsers - depID | userID

Вывод мне нужен будет

Прием
Джон Доу - 23.04.2010
Билл Смит - 4/22/2010

Учет
Стив Джонс - 4/22/2010
Джон Доу - 21.04.2010

Аудиторская
Стив Джонс - 4/21/2010
Билл Смит - 21.04.2010

Ответы [ 2 ]

2 голосов
/ 26 апреля 2010

Это должно дать вам 3 последних добавленных пользователя для каждого отдела (используя новую функцию ROW_NUMBER в SQL 2005):

select * from (select  D.name, U.name, U.dateadded, ROW_NUMBER() over (PARTITION BY D.depID ORDER BY U.dateadded DESC) as ROWID from Department as D
join DepUsers as DU on DU.depID = D.depID
join Users as U on U.userID = DU.userID) as T
where T.ROWID <= 3

Я не совсем понял, как вы хотели, чтобы выходные данные выглядели, но я думаю, что этот набор результатов дает вам толчок для начала, куда вы направляетесь.

1 голос
/ 26 апреля 2010

Попробуйте это:

WITH CTE AS
(
SELECT 
  ROW_NUMBER() OVER (PARTITION BY DepartmentName ORDER BY DateAdded DESC) AS RowNumber
  ,D.name AS DepartmentName
  ,U.name AS UserName
  ,U.dateadded AS DateAdded
FROM 
  DepUsers DU
INNER JOIN Users U
  ON DU.userID = U.userID
INNER JOIN Department D
  ON DU.depID = D.depID
)
SELECT
  DepartmentName
  ,UserName
  ,DateAdded
FROM CTE
WHERE RowNumber <= 3
ORDER BY DepartmentName, DateAdded DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...