2017-01-27 8 views
4

Я пытаюсь запустить ORDER BY на огромном наборе данных и создавать плотные значения ранга для извлечения различного количества строк на основе плотного ранжирования. Более того, я использую плотное значение ранга как суррогатный ключ во всем моем процессе, чтобы перенести промежуточные результаты и использовать его для дальнейшего тестирования производительности.ORDER BY в SQL Server vs Postgresql

Проблема я столкнулся: -

Проблема, которую я имею, я мигрировал набор данных из матрицы (PostGreSQL) (производственная среда) для SQL Server (Новая среда) и реализуется густую функцию ранга. Но из-за наличия разных плотных ранговых результатов, которые обусловлены поведением ORDER BY в SQL Server и Matrix, я не могу продолжить проверку кода и результатов.

Пример испытания: -

SELECT *,DENSE_RANK() OVER (ORDER BY Col) AS drnk FROM 
(
SELECT '#2 Mayfair Terrace' AS Col 
UNION 
SELECT '#2 MYSTIC COURT' AS Col 
)Z; 

SQL-сервера вывода: -

Матрица (Postgresql) Выход: -

Col    drnk 
#2 MYSTIC COURT  1 
#2 Mayfair Terrace 2 

Может ли кто-нибудь сказать мне, почему существует разница в поведении ORDER BY между двумя различными средами баз данных? Любая помощь будет оценена по достоинству. Благодарю.

+1

Это проблема сортировки. – Hogan

ответ

3

Это вызвано различной сортировкой collation. Попробуйте использовать collate

select * 
, dense_rank() over (
    order by col collate sql_latin1_general_cp437_bin 
    ) as drnk 
from (
select '#2 Mayfair Terrace' as col 
union all 
select '#2 MYSTIC COURT' as col 
) Z; 

возвращается

+--------------------+------+ 
|  col   | drnk | 
+--------------------+------+ 
| #2 MYSTIC COURT | 1 | 
| #2 Mayfair Terrace | 2 | 
+--------------------+------+ 

rextester: http://rextester.com/QGM99129

select * 
, dense_rank() over (
    order by col collate 
      sql_latin1_general_cp437_bin 
    ) as drnk 
from (
select '#2 Mayfair Terrace' as col 
union all select '#2 MYSTIC COURT' as col 
union all select '#2 NAYSTIC COURT' as col 
union all select '#2 NaYSTIC COURT' as col 
union all select '#2 LaYSTIC COURT' as col 
) Z; 

возвращает

+--------------------+------+ 
|  col   | drnk | 
+--------------------+------+ 
| #2 LaYSTIC COURT | 1 | 
| #2 MYSTIC COURT | 2 | 
| #2 Mayfair Terrace | 3 | 
| #2 NAYSTIC COURT | 4 | 
| #2 NaYSTIC COURT | 5 | 
+--------------------+------+ 
+0

Спасибо .. Нужно ли добавить его для каждого столбца, чтобы избежать этой проблемы? – Teja

+0

для всех столбцов символов в вашем заказе, да – SqlZim

+0

Отлично работает. Большое вам спасибо :) – Teja

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

  • Нет связанных вопросов^_^