如何高效地编写全范围 BIGINT 的键控逻辑
How to efficiently write keying logic for full range of BIGINT
我有一列输入了所有整数。在 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
范围)。
经过一轮性能测试,我们发现选项 1 在这种情况下是更优雅和最佳的解决方案。此外,此代码段是为许多表动态生成的,配置和打开和关闭它更容易。
我有一列输入了所有整数。在 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
范围)。
经过一轮性能测试,我们发现选项 1 在这种情况下是更优雅和最佳的解决方案。此外,此代码段是为许多表动态生成的,配置和打开和关闭它更容易。