Вы можете использовать ROW_NUMBER присвоить каждую строку числа основано на это относительное положение (как определенно ваш заказ):
SELECT ID,
Year,
Month,
Trades,
RowNum = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Year DESC, Month DESC)
FROM ExampleTable
WHERE Trades > 0;
С вашим примером данными это дает:
ID YEAR MONTH TRADES RowNum
1 2013 11 2 1
1 2013 4 42 2
Тогда вы можете просто ограничить это тем, где RowNum
is 1:
SELECT ID, Year, Month, Trades
FROM ( SELECT ID,
Year,
Month,
Trades,
RowNum = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Year DESC, Month DESC)
FROM ExampleTable
WHERE Trades > 0
) AS t
WHERE t.RowNum = 1;
Если, как в вашем примере, Year
и Month
сохраняются как VARCHAR
вам нужно будет преобразовать в INT
перед заказом:
RowNum = ROW_NUMBER() OVER(PARTITION BY ID
ORDER BY
CAST(Year AS INT) DESC,
CAST(Month AS INT) DESC)
Example on SQL Fiddle
Если вы только беспокоили о записях, где идентификатор 1, вы можете сделать это просто с помощью TOP
:
SELECT TOP 1 ID, Year, Month, Trades
FROM ExampleTable
WHERE ID = 1
AND Trades > 0
ORDER BY CAST(Year AS INT) DESC, CAST(MONTH AS INT) DESC;
вопрос не очень понятно, вы можете объяснить больше? –
Да, это немного нечеткое. Допустим, я хочу отслеживать клиентов с торговлей ID 1. Я хочу увидеть год и месяц, когда он последний раз сделал по крайней мере 1 сделку. – Dave