我正在Amazon Redshift
中创建一个表使用以下命令:
CREATE TABLE asmt.incorrect_question_pairs_unique
AS
SELECT question1,
question2,
occurrences,
occurrences / (SUM(occurrences)::FLOAT) OVER () AS prob_q1_q2
FROM (SELECT question1,
question2,
SUM(occurrences) AS occurrences
FROM asmt.incorrect_question_pairs
GROUP BY question1,
question2
HAVING SUM(occurrences) >= 50)
我也尝试了一个替代方案:
CREATE TABLE asmt.incorrect_question_pairs_unique
AS
SELECT question1,
question2,
occurrences,
occurrences::float / SUM(occurrences) OVER () AS prob_q1_q2
FROM (SELECT question1,
question2,
SUM(occurrences) AS occurrences
FROM asmt.incorrect_question_pairs
GROUP BY question1,
question2
HAVING SUM(occurrences) >= 50)
我想要专栏
prob_q1_q2
成为 float
列,这就是为什么我将分母/分子转换为 float
.但在结果表中,我在该列中得到全零。我想指出的是
SUM(occurrences)
将总计约 10 Billion
,所以列prob_q1_q2
将包含极小的值。有没有办法在 Amazon Redshift
中存储这么小的值? ?如何确保列中的所有值都非零
float
? 任何帮助,将不胜感激。
最佳答案
方法 1 - 我曾经有过同样的问题!就我而言,它是数百万行,所以我将结果乘以 10000。每当我想从该列中选择值时,我都会在 select 语句中除以 10000 以使其均匀。我知道这不是完美的解决方案,但对我有用。
方法 2 - 我创建了一个带有 Numeric(12,6) 数据类型的示例表,当我导入类似于您的结果集时,我可以看到浮点值高达 6 位小数精度。
我猜,当您使用 create table AS 命令时,转换不起作用,您需要创建指定数据类型的表,该数据类型强制将结果集存储到某个精度级别。这很奇怪!相同的选择如何返回 0.00,但是当插入到带有强制列的表中时,它返回 0.00333。
如果我做了一个错误的假设,请发表评论,我会重新调整我的答案。
关于sql - 在 Amazon Redshift 中存储极小的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42724392/