Получить последнюю запись каждого пользователя из таблицы SQL

Есть 2 таблицы, например Reader и Books.

Reader состоит из:

    ReaderId
    FirstName
    LastName
    Email

Books состоит из:

    BookId
    ReaderId
    Date
    BookNumber

Мне необходимо получить выборку, в которой будет отображаться последнее действие Reader и сколько книг он взял. Нужно отобразить все столбцы из двух таблиц не используя подзапросы

Вот пример заполнения данных:

CREATE TABLE Readers
(

    ReaderId INT IDENTITY PRIMARY KEY NOT NULL,
    FirstName VARCHAR(20) NOT NULL,
    LastName VARCHAR(20) NOT NULL,
    Email VARCHAR(50) NOT NULL UNIQUE,
)

CREATE TABLE Books
(
    BookId INT IDENTITY PRIMARY KEY NOT NULL,
    ReaderId INT NOT NULL 
             FOREIGN KEY REFERENCES Readers (ReaderId),
    ActionDate DATE NULL,
    BookNumber INT NOT NULL,
)

INSERT INTO Readers
(
    FirstName, LastName, Email
)
VALUES
('Антон', 'Иванов', '[email protected]'),
('Петр', 'Степанов', '[email protected]'),
('Игорь', 'Андреевич', '[email protected]'),
('Василий', 'Николаевич', '[email protected]')

INSERT INTO Books
(
   ReaderId, ActionDate, BookNumber
)
VALUES
(1, '2019-10-15', 2),
(1, '2019-02-15', 1),
(1, '2020-04-15', 5),
(2,'2020-06-13', 3),
(3, '2020-10-15', 10),
(3, '2021-02-15', 2),
(1, '2021-10-15', 7)

Вот какой запрос я пытаюсь сделать, но я не могу понять, как мне вывести ещё столбец BookNumber, чтоб он соответствовал BookId

SELECT r.*, max(BookId) AS 'BookId', MAX(ActionDate) AS 'ActionDate'
FROM Readers r
LEFT JOIN   Books b ON   b.ReaderId = r.ReaderId
GROUP BY    r.FirstName, 
            r.LastName, 
            r.Email,
            r.ReaderId

Версия: Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)


Ответы (1 шт):

Автор решения: user275841

В общем сделал след. образом

WITH TBL (ReaderId, FName, LName, Email,BookId, ActionDate, BookNumber) AS
(SELECT r.*, b.BookId, b.ActionDate, b.BookNumber
FROM Readers r
LEFT JOIN   Books b ON   b.ReaderId = r.ReaderId)

SELECT a.ReaderId, a.FName, a.LName, a.Email, a.BookId, a.ActionDate, a.BookNumber
FROM TBL a
LEFT OUTER JOIN TBL b
ON a.ReaderId = b.ReaderId 
AND a.ActionDate < b.ActionDate
WHERE b.ReaderId IS NULL
ORDER BY a.ReaderId;
→ Ссылка