2017-02-13 6 views
0

Я тестирую сложное правило базы данных, и мне нужна помощь в формулировании логики для тестирования ниже сценария.сбор записей из результата SQL-запроса на основе ранга

У меня есть выход, как показано ниже, скажем, имя таблицы температуры

BUSINESS_KEY  STATUS_KEY CREATE_TIMESTAMP 
123    a1   1 P.M. 
123    a1   1:30 P.M. 
123    b1   2:00 P.M. 
123    a1   2:30 P.M. 

Я должен забрать ниже записей из выше

BUSINESS_KEY  STATUS_KEY CREATE_TIMESTAMP 
123    a1   1 P.M. 
123    b1   2:00 P.M. 
123    a1   2:30 P.M. 

я должен отбросить вторую запись, правило если тот же status_key приходит на выходе для последовательных временных меток, как это было в примере выше 1:00 PM и 1:30 P.M., только самая ранняя запись метки времени подобрана. Мне разрешено выбрать четвертую запись, поскольку она не соответствует первой.

Я пробовал все ряды(), row_number, сочетания self join, но не работал. Кто-нибудь может помочь?

+0

Я просто отвечал на подобный вопрос [здесь] (http://stackoverflow.com/questions/42142981/how-to-group -this-data-so-i-can-pull-out-specific-rows-from-each-group/42145336 # 42145336) с использованием 'LAG' и' ROW_NUMBER() '. Я бы предложил сохранить этот TIMESTAMP как 'DATETIME', хотя ... потому что упорядочение ваших данных через несколько дней вызовет у вас некоторые головные боли. Что, если время было 11:50, а затем 00:01? – scsimon

ответ

0

Один метод использует lag(), другой использует разницу row_number(). Последний подходит для предварительного SQL Server 2012. С lag() этого легко:

select t.* 
from (select t.*, 
      lag(status_key) over (partition by business_key order by create_timestamp) as prev_status_key 
     from t 
    ) t 
where prev_status_key is null or prev_status_key <> status_key; 
+0

Этот намек работал на меня. благодаря – Chaitanya

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