2014-10-22 3 views
1

У меня есть таблица SQL Server, как это:SQL Server: получение год и месяц

http://sqlfiddle.com/#!2/a15dd/1

То, что я хочу сделать, это отобразить последний год и месяц, где были сделаны сделки.

В этом случае, я хочу, чтобы отобразить

ID: 1 
Year: 2013 
Month: 11 
Trades: 2 

Я пытался использовать:

select 
    id, MAX(year), MAX(month) 
from 
    ExampleTable 
where 
    trades > 0 
group by 
    id 

ли я конкатенации столбцы?

+1

вопрос не очень понятно, вы можете объяснить больше? –

+0

Да, это немного нечеткое. Допустим, я хочу отслеживать клиентов с торговлей ID 1. Я хочу увидеть год и месяц, когда он последний раз сделал по крайней мере 1 сделку. – Dave

ответ

2

Вы можете использовать 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; 
+0

Спасибо, Гарет, это именно то, что я искал. – Dave

1

Почему магазин «год» и «Монт h "как отдельные столбцы? В любом случае основной логикой является объединение двух значений для получения последней. Это неудобно, потому что вы храните цифры в виде строк, а месяцы не заполняются нулями. Но это не так уж трудно:

select id, 
     max(year + right('00' + month, 2)) 
from ExampleTable 
group by id; 

Чтобы отделить их:

select id, 
     left(max(year + right('00' + month, 2)), 4) as year, 
     right(max(year + right('00' + month, 2)), 2) as month 
from ExampleTable 
group by id; 

Here является SQL Скрипки. Обратите внимание, что при использовании SQL Fiddle вы должны установить базу данных в правильную базу данных.

1

Я не уверен, правильно ли я получил ваш вопрос, но не должен ли работать следующий?

SELECT TOP 1 year + '-' + month AS Last, trades 
    FROM ExampleTable 
    WHERE CAST(trades AS INTEGER) > 0 
ORDER BY CAST(year AS integer) DESC, CAST(month AS integer) DESC 

SQLFiddle

1

Попробуйте

SELECT TOP 1 ID, [year], trades, 
       MAX(Convert(INT,[month])) OVER(PARTITION BY [year]) AS [Month] 
FROM ExampleTable 
WHERE trades > 0 
Смежные вопросы