Получить записи с последней записью, используя номер строки и раздел с помощью объединений - PullRequest
1 голос
/ 13 апреля 2020

Вот мой SQL Таблица сервера:

 DECLARE @EMP TABLE
    (
        Id INT,
        NAME VARCHAR(200),
        AlarmOnTimeStamp DATETIMEOFFSET,
        AlarmOffTimeStamp DATETIMEOFFSET NULL
    );

DECLARE @EMPCOMMENT TABLE
(
    EmpId INT,
    Comment VARCHAR(2000)
)

INSERT INTO @EMP VALUES (1121, 'Test1', '2020-04-09 01:56:29.507', NULL)
INSERT INTO @EMP VALUES (57, 'Test1', '2020-04-09 02:56:29.507', NULL)
INSERT INTO @EMP VALUES (992, 'Test2', '2020-04-09 01:56:29.507', '2020-04-09 03:56:29.507')

INSERT INTO @EMPCOMMENT VALUES (2, 'Test1')
INSERT INTO @EMPCOMMENT VALUES (2, 'Test2')

SELECT *
FROM @emp e
LEFT JOIN @EMPCOMMENT ec ON ec.Id = e.Id

SELECT
    *,
    rn = ROW_NUMBER() OVER (PARTITION BY e.Name ORDER BY AlarmOnTimeStamp, e.Name DESC) 
FROM @emp e
LEFT JOIN @EMPCOMMENT ec ON e.Id = ec.EmpId

введите описание изображения здесь

Вывод:

  Id      Name      AlarmOnTimeStamp           AlarmOffTimeStamp      EmpId     Comment    rn
  --------------------------------------------------------------------------------------------
  2       Test1      2020-04-09 02:56:29         NULL                  2          Good      1
  2       Test1      2020-04-09 02:56:29         NULL                  2          Best      1
  3       Test2      2020-04-09 01:56:29  2020-04-09 03:56:29.50       NULL       NULL      1

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

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

1 Ответ

0 голосов
/ 13 апреля 2020

Я думаю, что вы хотите:

SELECT *
FROM (
    SELECT *, RANK() OVER(PARTITION BY e.Name ORDER BY e.AlarmOnTimeStamp desc) rn
    FROM @emp e
    LEFT JOIN @EMPCOMMENT ec ON ec.EmpId = e.Id
) t
WHERE rn = 1

Это ранжирует строки с одинаковым именем сотрудника по убыванию идентификатора и сохраняет только верхние строки (включая связи).

Для вашего примера данные, запрос дает :

Id | NAME  | AlarmOnTimeStamp            | AlarmOffTimeStamp           | EmpId | Comment | rn
-: | :---- | :-------------------------- | :-------------------------- | ----: | :------ | :-
 2 | Test1 | 2020-04-09 02:56:29.5070000 | <em>null</em>                        |     2 | Test1   | 1 
 2 | Test1 | 2020-04-09 02:56:29.5070000 | <em>null</em>                        |     2 | Test2   | 1 
 3 | Test2 | 2020-04-09 01:56:29.5070000 | 2020-04-09 03:56:29.5070000 |  <em>null</em> | <em>null</em>    | 1 
...