SQL Server 与 Postgresql 中的 ORDER BY

Tej*_*eja 5 sql sql-server postgresql sql-order-by dense-rank

我正在尝试在庞大的数据集上运行 ORDER BY 并生成密集排名值以根据密集排名提取不同数量的行。后来,我在整个过程中使用密集排名值作为代理键来推进中间结果并将其进一步用于一些性能测试。

我面临的问题:-

我遇到的问题是我将数据集从 Matrix(postgresql)(PRODUCTION environment) 迁移到 SQL Server(New environment) 并实现了密集排名功能。但是由于 SQL Server 和 Matrix 中的 ORDER BY 子句行为导致不同的密集排名结果,我无法进一步验证代码和结果。

测试示例:-

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

SQL Server 输出:-

Col                drnk
#2 Mayfair Terrace  1
#2 MYSTIC COURT     2
Run Code Online (Sandbox Code Playgroud)

矩阵(Postgresql)输出:-

Col                drnk
#2 MYSTIC COURT     1
#2 Mayfair Terrace  2
Run Code Online (Sandbox Code Playgroud)

有人能告诉我为什么两个不同的数据库环境之间 ORDER BY 的行为存在差异吗?任何帮助,将不胜感激。谢谢。

Sql*_*Zim 3

这是由不同的排序规则引起的。尝试使用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;
Run Code Online (Sandbox Code Playgroud)

回报

+--------------------+------+
|        col         | drnk |
+--------------------+------+
| #2 MYSTIC COURT    |    1 |
| #2 Mayfair Terrace |    2 |
+--------------------+------+
Run Code Online (Sandbox Code Playgroud)

雷克斯特: 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;
Run Code Online (Sandbox Code Playgroud)

回报

+--------------------+------+
|        col         | drnk |
+--------------------+------+
| #2 LaYSTIC COURT   |    1 |
| #2 MYSTIC COURT    |    2 |
| #2 Mayfair Terrace |    3 |
| #2 NAYSTIC COURT   |    4 |
| #2 NaYSTIC COURT   |    5 |
+--------------------+------+
Run Code Online (Sandbox Code Playgroud)