我正在使用以下命令在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个十进制精度。
sql - 在Amazon Redshift中存储极小的值-LMLPHP

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

10-07 17:46