#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