Teradata

在 Teradata SQL 中,如何從欄位/列中獲取一對之間的隨機數?

  • March 8, 2021

我最近在 Teradata 中遇到了一個簡單的問題:如何在來自欄位/列的一對數字之間獲取隨機數?

函式 RANDOM( lower_bound , upper_bound ) 顯然僅限於接受修復號而不是欄位/列名。

--THIS ONE FAILS:
WITH TRIAL(CATEGORY, VAL_MIN, VAL_MAX) AS (
SELECT 'A', 0, 3 FROM CTE UNION ALL
SELECT 'B', 1, 9 FROM CTE UNION ALL
SELECT 'C', 2, 5 FROM CTE UNION ALL
SELECT 'D', 1, 12 FROM CTE
), CTE(DUMMY) AS (SELECT 'X')
SELECT T.*,
RANDOM(T.VAL_MIN, T.VAL_MIN) --HERE'S THE PROBLEM
FROM TRIAL T;

--THIS ONE WORKS:
WITH TRIAL(CATEGORY, VAL_MIN, VAL_MAX) AS (
SELECT 'A', 0, 3 FROM CTE UNION ALL
SELECT 'B', 1, 9 FROM CTE UNION ALL
SELECT 'C', 2, 5 FROM CTE UNION ALL
SELECT 'D', 1, 12 FROM CTE
), CTE(DUMMY) AS (SELECT 'X')
SELECT T.*,
RANDOM(1, 7) --HERE'S THE PROBLEM
FROM TRIAL T;

我很確定有一個簡單的解決方案。非常感謝任何幫助。

這將返回請求範圍內的數字:

RANDOM(0, 2147483647) mod (T.VAL_MAX - T.VAL_MIN +1 ) + T.VAL_MIN

但是由於 MOD,可能會對較低的數字產生最小的偏差,例如,對於 1-3,您會得到以下機率:

1,2 = 715,827,883 / 2,147,483,648 
 3 = 715,827,882 / 2,147,483,648

引用自:https://dba.stackexchange.com/questions/286480