2013-10-25 2 views
1

Я отсортировал данные по accNumber и Date (3rd coulmn) и сгруппировал их по accNumber и Rest. Для каждого номера счета может быть много дат (3-й столбец, отсортированный от наименьшего к наибольшему). Я хочу выбрать строки с наивысшей датой (3-й столбец) для каждого accNumber. Вот код для сортировки и группировки (здесь я хочу выбрать строки с самой большой датой в 3 columnfor каждого accNumber):Выбор последней самой большой строки по дате

select a.accNumber, a.Rest, min(a.Date), max(b.Date) 
from t1 a, t1 b 
where a.Rest=b.Rest 
and a.accnumber=b.accnumber 
group by a.accNumber, a.Rest 
order by a.accNumber, 3 

Я использую MS SQL. Заранее спасибо

+0

Сортировка по количеству - это плохая практика. –

+0

@AmirrezaKeshavarz, Не могли бы вы объяснить? – NoChance

+0

order by a.accNumber, 3, если ваш порядок столбцов изменяется, ваш запрос не будет работать должным образом. –

ответ

0

Пожалуйста, попробуйте:

SELECT 
    accNumber, 
    Rest, 
    Date, 
    MaxDate 
FROM(
    select 
     accNumber, Rest, Date, 
     MAX(Date) OVER (Partition by accNumber, Rest) MaxDate, 
     ROW_NUMBER() OVER(Partition by accNumber order by Date desc) RNum 
    from 
     t1 
)x 
WHERE RNum=1 
+0

Спасибо. но это не то, что я хочу, изначально у меня было 4 столбца из двух таблиц, и здесь есть только три столбца из одной таблицы. Я не хочу менять структуру, выбираю только строки, где дата наибольшая для каждого accNumber. –

+0

Проверьте отредактированный ответ. – TechDo

+0

Пожалуйста, не используйте синтаксис implicit-join (разделяемый запятой 'FROM'), пожалуйста, всегда явно квалифицируйте свои объединения. Между прочим, сложнее потерять условие соединения таким образом. –

0

выглядит как вам не нужно присоединиться здесь, вы можете сделать это с помощью функций окна:

with cte as (
    select 
     a.accNumber, a.Rest, 
     min(a.Date) over(partition by a.accNumber, a.Rest) as min_Date, 
     max(a.Date) over(partition by a.accNumber, a.Rest) as max_Date, 
     row_number() over(partition by a.accNumber order by a.Date desc) as rn 
    from t1 as a 
) 
select accNumber, Rest, min_Date, max_Date 
from cte 
where rn = 1 

Немного трудно писать код без теста данные, но это должно сделать трюк

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