2016-02-29 2 views
1

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

Account# Charge_code PostingDate  Balance 
    12345   35  1/18/2016  100 
**12345   35  1/20/2016  200** 
    12345   61  1/23/2016  250 
    12345   61  1/22/2016  300 
    12222   41  1/20/2016  200 
**12222   41  1/21/2016  250** 
    12222   42  1/23/2016  100 
    12222   42  1/25/2016  600 

Как выбрать последнюю строку перед изменением столбца charge_code для каждой учетной записи #. Я выделил строки, которые я пытаюсь вернуть.

Запрос должен выполняться быстро, когда таблица содержит десятки тысяч записей.

+0

Вы имеете в виду выбор последней строки, отсортированной по PostingDate? –

+0

Совместное исследование поможет всем. Расскажите, что вы пробовали и почему это не соответствовало вашим потребностям. Это демонстрирует, что вы потратили время, чтобы попытаться помочь себе, это избавляет нас от повторения очевидных ответов и, прежде всего, помогает вам получить более конкретный и релевантный ответ! Также см. [Ask]. Помните, что SO не является бесплатным кодовым сервисом! –

+0

выбрать. [Account #] , а. [Charge_Code] , а. [PostingDate] , а. [Balance] из [DBO]. [SampleTable] в качестве перекрестное соединение [DBO]. [SampleTable ] как b , где a. [Учетная запись #] = b. [Учетная запись #] и a. [PostingDate]> b. [PostingDate] и не существует (выберите * из [dbo]. [SampleTable] as c где a. [Учетная запись #] = c. [Учетная запись #] и a. [PostingDate]> c. [PostingDate] и c. [PostingDate]> b. [PostingDate] ) и. [Charge_Code] < > b. [Charge_Code] –

ответ

1

В SQL Server 2012+, можно использовать lead():

select t.* 
from (select t.*, 
      lead(charge_code) over (partition by account order by postingdate) as next_charge_code 
     from t 
    ) t 
where charge_code <> next_charge_code; 

В более ранних версиях SQL Server, вы можете сделать что-то подобное с apply.

+0

Спасибо, Гордон, это сработало! –

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