Интересная ошибка Row_Number()

Я экспериментировал с Stack Exchange Data Explorer и выполнил следующий запрос:
https://data.stackexchange.com/stackoverflow/query/2820/rising-stars-top-50-users-ordered-on-rep-per-day

Обратите внимание, что в результатах строки 11 и 12 имеют одинаковое значение и поэтому неправильно пронумерованы, хотя функция row_number() принимает тот же порядок параметров, что и запрос.

Я знаю, что правильным решением здесь является указание дополнительного столбца разрешения конфликтов в порядке следования предложений, но мне более любопытно, почему/как функция row_number() возвращает разные результаты для одних и тех же данных?

Если это где-то имеет значение, это работает в Azure.


person Joel Coehoorn    schedule 10.06.2010    source источник


Ответы (4)


Проблема, кажется, со значащими цифрами. Например: у polygenelubricants репутация 22281, полученная за 101 день, а у KennyTM — 39257 репутации, полученная за 178 дней. Целая часть обоих RepPerDays равна 220, но плавающее значение Reputation/Days для полигенных смазок составляет 220,603####, а для KennyTM — 220,544####.

Вы должны попробовать заказать по репутации / дням оба раза.

person Fede    schedule 10.06.2010

Они правильно пронумерованы — ваш ORDER BY предназначен для другого столбца. Хотя в конечном итоге они оценивают одно и то же значение, ORDER BY в ROW_NUMBER не следует рассматривать как синхронизированный с ORDER BY для запроса.

person OMG Ponies    schedule 10.06.2010
comment
Истинный. ЕСЛИ вы хотите упорядочить по порядку в row_number(), сначала спроектируйте row_number в подзапросе (или CTE), а порядок - по спроецированному row_number - person Remus Rusanu; 10.06.2010

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

person Khorkrak    schedule 10.06.2010

Как DENSE_RANK, RANK и ROW_NUMBER сравниваются в этом запросе - все еще непоследовательное поведение?

ROW_NUMBER(), очевидно, присваивается первым, но ORDER BY не указывает, что вывод должен быть отсортирован по ROW_NUMBER, поэтому вывод может быть выведен в любом порядке.

Сделай это:

ORDER BY
RepPerDays DESC, Row_number() OVER(ORDER BY Reputation/Days DESC)​

И приказано соответствовать.

person Cade Roux    schedule 10.06.2010
comment
хм, это соответствует, но это все еще не в порядке. Я должен бросить как поплавок, чтобы понять это правильно. И на этом этапе проще просто использовать исходное выражение Reputation/Days и привести к нему один операнд. - person Joel Coehoorn; 10.06.2010