我正在使用以下命令在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命令时,转换将不起作用,您需要创建表来指定将结果集存储到一定精度级别的数据类型。这很奇怪!相同的select如何返回0.00,但是当插入具有强制列的表时,它将返回0.00333。
如果我做出了错误的假设,请发表评论,然后重新调整答案。