Вы не определили, какой сервер и версию вы используете - если вы используете SQL Server 2005 или новее, вы можете использовать CTE (Common Table Expression) и функцию ранжирования - что-то вроде этого:
;WITH PartitionedData AS
(
SELECT
pc_tmppl_attach, pc_tmppl_val1, pc_tmppl_crtdt,
ROW_NUMBER() OVER(PARTITION BY pc_tmppl_val1
ORDER BY pc_tmppl_crtdt DESC) AS 'RowNumber'
FROM dbo.pc_tmppl_tbl
)
SELECT
pc_tmppl_attach, pc_tmppl_val1, pc_tmppl_crtdt
FROM
PartitionedData
WHERE
RowNumber = 1
По сути, CTE (внутренний выбор) собирает все данные из вашей таблицы, разбивает их по столбцу pc_tmppl_val1
, поэтому каждая группа значений для pc_tmppl_val1
начинает обратный отсчет с 1 - и упорядочивает эти записи по pc_tmppl_crtdt
по убыванию - самая новая запись - первая.
Таким образом, для каждого значения pc_tmppl_val1
самая новая запись - это запись с RowNumber = 1
, и это то, что дает внешний SELECT
(основанный на CTE).
CTE и функция ранжирования также очень гибкие - если вам нужно добавить 3 верхние записи для каждого значения pc_tmppl_val1
, просто измените внешнее условие WHERE
на
WHERE RowNumber <= 3
и все готово!
Функции CTE (Common Table Expression) и ранжирования соответствуют стандарту ANSI SQL - поэтому его поддерживают и другие базы данных, кроме Microsoft SQL Server (я просто знаю SQL Server лучше всего - поэтому я использую его в качестве образца).