SQL: выберите строку с последним новым последовательно отличающимся значением - PullRequest
0 голосов
/ 03 июня 2019

РЕДАКТИРОВАТЬ: см. Обновленный вопрос здесь: SQL: Выберите самое последнее последовательно различающееся значение с группировкой

У меня проблемы с написанием запроса, в котором было бы выбрано последнее «новое» последовательно различающееся значение. Поскольку это немного неоднозначно, вот пример для объяснения (предположим, что номер строки указывает на последовательность; в моем выпуске строки упорядочены по дате):

|--------|-------|
| RowNum | Col A |
|--------|-------|
| 1      | A     |
| 2      | B     |
| 3      | C     |
| 4      | B     |
| 5      | A     |
| 6      | B     |

Выберет:

| 6      | B     |

Хотя B также появляется в строках 2 и 4, тот факт, что строка 5 содержит A, означает, что B в ряду 6 последовательно различается. Но если таблица выглядела так:

|--------|-------|
| RowNum | Col A |
|--------|-------|
| 1      | A     |
| 2      | B     |
| 3      | C     |
| 4      | B     |
| 5      | A     |
| 6      | A     | <--

Тогда мы бы хотели выбрать:

| 5      | A     |

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

Я пытался решить эту проблему, вычисляя минимальные / максимальные числа строк, где появляется каждое значение Col A. Этот расчет (с использованием второй таблицы образцов) даст такой результат:

|--------|--------|--------|
| ColA   | MinRow | MaxRow |
|--------|--------|--------|
| A      | 1      | 6      |
| B      | 2      | 4      |
| C      | 3      | 3      | 

Однако это то, где я застреваю, потому что, хотя я могу правильно выбрать A в качестве значения для использования, я не знаю, как использовать другие строки в этой таблице, чтобы распознать, что мы хотим A в строке 5 ( так как он прерван B на 4), а не A в строке 1 ...

Буду признателен за любую помощь в решении этой проблемы, если это вообще возможно сделать в SQL. Я использую SQL 2008 SP4.

1 Ответ

0 голосов
/ 03 июня 2019

Вы можете сделать это, найдя предыдущий RowNum нужной вам строки в качестве результата, а затем получите следующий Rownum:

select top 1 *
from tablename
where 
  RowNum > coalesce((
    select max(RowNum) from tablename where colA <> (
      select top 1 colA from tablename order by RowNum desc
    )
  ), 0) 
order by RowNum

См. demo .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...