2015-10-07 3 views
3

Это пример таблицыSQL SERVER QUERY, чтобы выбрать максимальное значение записи за единицу

enter image description here

Что мне нужно добиться того, чтобы получить или отображать только запись арендатора с наибольшим значением месяца. Если месяц равен, я должен основываться на последнем значении даты. Здесь образец требуемого выходного

enter image description here

С этим, я начал с этим кодом, используя максимальную функцию и временную таблицу включено, но не в состоянии получить желаемый результат.

select tenant, name, date, month 
into #sample 
from tenant 


select * 
from #sample 
where months = (select max(months)from #sample) 

и выводят что-то вроде этого. Как я считаю, код получает максимальное значение во всем списке, не учитывающем фильтрацию арендатора.

enter image description here

Любая помощь будет принята с благодарностью :)

ответ

6

Это можно сделать с помощью функции row_number окна:

select tenant, name, date, months 
    from (select t.*, 
       row_number() over (partition by t.tenant, t.name order by t.months desc, t.date desc) as rn 
      from TableName t) x 
where rn = 1 
+0

Это работало. Могу ли я просто спросить, всегда ли он возвращается к 1? – rickyProgrammer

+2

Для каждого отдельного набора 'tenant/name' (' partition by' clause) функция 'row_number' будет последовательно содержать строки' 1,2,3,4, ... ', * всегда начиная с' 1' *, используя опцию 'order by' для определения последовательности. Итак, поскольку в предложении 'order by' задано' t.months desc, t.date desc' для каждой комбинации «арендатор/имя», строка с наибольшим значением «месяцев» (и последняя «дата», если больше чем одна строка имеет одно и то же значение «месяцев») будет иметь значение 'rn'' 1'. – sstan

+0

Чтобы лучше понять это, попробуйте запустить подзапрос самостоятельно, чтобы вы могли видеть значения 'rn' для всех строк. – sstan

5

Вы можете использовать row_number функцию.

Запрос

;with cte as 
(
    select rn = row_number() over 
    (
     partition by tenant 
     order by months desc,[date] desc 
    ),* 
    from table_name 
) 
select tenant,name,[date],months from cte 
where rn = 1; 
+0

Есть ли какое-либо преимущество использования выражения Common Table над подзапросом (как это сделано в другом ответе)? – pseudocoder

+2

CTE может использоваться рекурсивно; подзапрос не может. Это делает их особенно хорошо подходящими для древовидных структур. http://stackoverflow.com/questions/706972/difference-between-cte-and-subquery –

+0

@Ajmot OK спасибо, но для того, чтобы быть ясным, нет необходимости в рекурсии в этом конкретном приложении, верно? – pseudocoder

Смежные вопросы