Rabee3-F1.787545 Ответов: 2

Выберите последнюю запись в списке по дате


Курс Временной Метки Валюты
ЛПБ 2019-01-01 1.0000
ЛПБ 2019-01-06 1.0000
2019-01-01 долларов 1500.0000
США 2019-01-06 1057.5000

Результат должен показывать только
ЛПБ 2019-01-06 1.0000
США 2019-01-06 1057.5000

Что я уже пробовал:

SELECT Distinct([Currency]),MAX([TimeStamp]),[Rate] FROM [DB_SchoolManager].[dbo].[tbl_Currencies] 
group by [Currency],[Rate]

2 Ответов

Рейтинг:
5

Maciej Los

В дополнение к Венделиус[^] ответ:

USE [DB_SchoolManager];

--Using MAX + GROUP BY
SELECT T.*
FROM tbl_Currencies AS T INNER JOIN (
	SELECT Currency, MAX([TimeStamp]) AS [TimeStamp]
	FROM tbl_Currencies 
	GROUP BY Currency 
) AS H ON T.Currency = H.Currency AND T.[TimeStamp] = H.[TimeStamp] 

--Using ROW_NUMBER() inline function
SELECT T.*
FROM (
	SELECT *, ROW_NUMBER() OVER(PARTITION BY Currency ORDER BY [TimeStamp] DESC) AS Rn
	FROM tbl_Currencies
	) AS T
WHERE T.Rn=1


Оба запроса возвращают:
USD	2019-01-06	1057.5
LPB	2019-01-06	1


Для получения более подробной информации, пожалуйста, смотрите:
Визуальное представление SQL-соединений[^]
ROW_NUMBER (Transact-SQL) - SQL Server | Microsoft Docs[^]
GROUP BY (Transact-SQL) - SQL Server | Microsoft Docs[^]


Рейтинг:
2

Wendelius

Это звучит как домашнее задание, так что не буду давать скучный ответ. Однако, чтобы указать вам правильное направление, вы можете использовать Предложение ORDER BY (Transact-SQL) - SQL Server | Microsoft Docs[^] и TOP (Transact-SQL) - SQL Server | Microsoft Docs[^] для выполнения задания.


Maciej Los

;)