MS SQL: Почему ROW_NUMBER не дает ожидаемых результатов? - PullRequest
1 голос
/ 16 января 2020

У меня есть таблица с полем datetime («время») и полем int («индекс»)

Пожалуйста, посмотрите запрос и картинку ниже. Я хочу, чтобы ROW_NUMBER отсчитывал от 1 при изменении индекса, также если значение индекса существует в предыдущих строках. Красный текст указывает на вывод, который я хочу получить из запроса. Как я могу изменить запрос, чтобы получить ожидаемые результаты?

Запрос:

select rv.[time], rv.[index], ROW_NUMBER() OVER(PARTITION BY rv.[index] ORDER BY  rv.[time],  rv.[index] ASC) AS Row# 
from 
tbl

1 Ответ

5 голосов
/ 16 января 2020

Это проблема пробелов и островков. Вам необходимо определить группы смежных строк. В этом случае, я думаю, самый простой метод - это разница номеров строк:

select rv.*,
       row_number() over (partition by index, (seqnum - seqnum_2) order by time) as row_num
from (select t.*,
             row_number() over (order by time) as seqnum,
             row_number() over (partition by index order by time) as seqnum_2
      from tbl t
     ) rv;

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

Кроме того, вы не должны использовать имена, такие как time и index для столбцов, потому что это ключевые слова в SQL. Я не избежал имен в приведенном выше запросе. Я призываю вас дать имена столбцам и таблицам, которые не нужно экранировать.

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