0

我有一列包含整个整数范围。在列上生成键的同时INT,我需要将 0 和负数向下推(有序 DESC),将正键保持在顶部(有序 ASC/DESC)。我想出了两种方法,但我不确定哪种方法最好

方法 1:更整洁但不确定可扩展性

WITH t1(c1) AS
(
SELECT 11 UNION ALL
SELECT 2 UNION ALL
SELECT 0 UNION ALL
SELECT -1 UNION ALL
SELECT -11 
)
SELECT c1, ROW_NUMBER() OVER (ORDER BY 
                             CASE WHEN c1 <=0 THEN c1 END DESC , 
                             CASE WHEN c1 >0 THEN c1 END ASC) keys
FROM t1 ;

方法 2:可扩展

WITH t1(c1) AS
(
SELECT 11 UNION ALL
SELECT 2 UNION ALL
SELECT 0 UNION ALL
SELECT -1 UNION ALL
SELECT -11 
)
SELECT c1, ROW_NUMBER() OVER (ORDER BY c1 ASC) keys
FROM t1 
WHERE c1 >0
UNION ALL 
-- Need to include Max keys from previous step in actual implementation    
SELECT c1, 
       maxkeys + ROW_NUMBER() OVER (ORDER BY c1 DESC) keys 
FROM t1 
WHERE c1 <= 0

;

请建议任何其他更好的可扩展性(BIGINT范围)替代方案。

4

1 回答 1

0

经过一轮性能测试,我们发现选项 1 在这种情况下是更优雅和最佳的解决方案。此外,这个片段是为大量表动态生成的,更容易配置和打开和关闭。

于 2017-12-20T11:23:21.197 回答