TSQL — выберите последнюю дату по типу 2

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Мне нужны данные выбора в SQL Server. У меня есть пример данных, подобный этому

 DECLARE @tblA TABLE (ID int, SubId int, Createdate DateTime)

INSERT INTO @tblA VALUES (1, 1, '10/21/2020')
                         , (2, 1, '10/21/2020')
                         , (3, 1, '10/27/2020')
                         , (4, 2, '10/21/2020')
                         , (5, 2, '10/21/2020')
                         , (6, 1, '10/21/2020')
                         , (7, 2, '10/23/2020')
                         , (8, 2, '10/22/2020')
                         , (9, 1, '10/25/2020')
                         , (10, 3, '10/21/2020')
  

Я хочу получить 4 записи (в таблице будет много идентификаторов SubID)
2 записи последней даты по SubID = 1
2 записи последней даты по SubID = 2
В следующем примере я ожидаю, что Select с выводом подобной таблицы

 DECLARE @tblOutput Table (ID int, SubId int, Createdate DateTime)

INSERT INTO @tblOutput VALUES (3, 1, '10/27/2020')
                        , (9, 1, '10/25/2020')
                        , (7, 2, '10/23/2020')
                        , (8, 2, '10/22/2020')
  

Пример «всплывающая подсказка»

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

Пожалуйста, помогите мне выбрать это. Спасибо.

Ответ №1:

Вы можете использовать Row_Number() функцию, как показано ниже:

 Create table tblA  (ID int, SubId int, Createdate DateTime)

Insert Into tblA values   (1,  1, '10/21/2020')
                         , (2, 1, '10/21/2020')
                         , (3, 1, '10/27/2020')
                         , (4, 2, '10/21/2020')
                         , (5, 2, '10/21/2020')
                         , (6, 1, '10/21/2020')
                         , (7, 2, '10/23/2020')
                         , (8, 2, '10/22/2020')
                         , (9, 1, '10/25/2020')
                         , (10, 3, '10/21/2020')
select Id
 , SubId
 , Createdate
from(
  select *
     , Row_Number() Over (Partition By SubId order by Createdate desc) as RNo
  from tblA
)temp where RNo <= 2 and SubId in (1, 2)
Order by SubId
  

Живая демонстрация db<>fiddle