SQL, использующий ROW_NUMBER() НАД РАЗДЕЛЕНИЕМ ПО ПОРЯДКУ x ПО y, когда x и y одинаковы для нескольких строк

#sql

Вопрос:

Это код, который я запускаю:

 ROW_NUMBER() OVER (PARTITION BY id ORDER BY a,b) as seq  

Это пример таблицы, с которой я работаю:

 | id | a | b |name| | --- | --- | - | -- | | 1 |12345| 14 |John| | 1 |12345| 14 |Anne| | 1 |23456| 14 |Dave| | 2 |45445| 16 |Matt|  

Когда значение seq присваивается первым двум строкам, как определяется порядок? Задавая этот вопрос в качестве идентификатора, a и b одинаковы для обеих строк, и, похоже, они меняются между разными запусками.

Комментарии:

1. Без заказа со стороны он неопределенен во время выполнения из-за факторов, влияющих на него. Нам нужно было бы знать, как оптимизатор работает с планом, который он использовал, и всю статистику, индексы и значения, которые движок использует во время выполнения, чтобы знать. Вряд ли вы все это узнаете. Учитывая, что оптимизатор «свободен в выборе» того, что он считает лучшим/самым простым/наиболее эффективным; что может привести к различным заказам при разных запусках. Проще говоря, добавьте имя в свой заказ, если вы хотите, чтобы оно «несколько» соответствовало. эй, если появится «12345» 14 «Бев». Дейву больше не будет 3 лет..

Ответ №1:

как решается вопрос о заказе?

Заказ будет таким, какой наиболее удобен для Sql Server. Иногда это будет таблица заказа (определяется первичный ключ (кластеризованный индекс) исходной таблицы, а не вставить порядке), но много вещей, которые могут связываться с этим, такой, что вы даже можете сделать различные заказы от одного момента к следующему, даже для одного и того же запроса. Если это важно, вы должны добавить больше полей в порядке, предусмотренном пунктом пока она не станет достаточно конкретными.