Получить последнюю запись каждого пользователя из таблицы 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;