在Amazon Redshift中存储极小的值

时间:2017-03-10 17:31:25

标签: sql amazon-redshift

我正在使用以下命令在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

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:1)

方法1 - 我遇到了同样的问题!在我的情况下,它是百万行,所以我将结果乘以10000.
每当我想从该列中选择值时,我将在select语句中除以10000以使其均匀。我知道它不是完美的解决方案,但对我有用。

方法2 - 我创建了一个带有数字(12,6)数据类型的样本表,当我导入类似于你的结果集时,我可以看到浮点值最多为6位小数。
<登记/> enter image description here


我猜,当你使用create table AS命令时,转换不起作用,你需要创建指定数据类型的表,该数据类型强制将结果集存储到某个精度级别。它很奇怪!同一个select如何返回0.00但是当插入带有强制列的表时,它返回0.00333。

如果我做了一个错误的假设,请发表评论,我将重新调整我的答案。

答案 1 :(得分:1)

Patthebug,

您可能会得到一个太低的数字,无法存储在FLOAT类型的Amazon Redshift中。尝试使用DECIMAL,它无法存储您的值,它是一个128位变量。

它的工作方式如下,如果值太大或在你的情况下太小而且它超过了你的类型的最大/最小值,则修剪最后的数字,然后将新的(修剪的)值存储在您的类型的变量/列。 当它削减一个很大的价值时,你几乎没有什么可以让你说你在200亿美元中削减20美分,你不会受到太大伤害。但是在你的情况下,当数字太小时,你可以在修剪最后一个数字以适应类型时放松一切 (fe类型最多可存储5位数,并且您希望在此类型的变量/列中存储0.000009的值。您的值不适合该类型,因此它从最后2位数中修剪,因此它可以适合您收到0.0000的新值

因此,如果您按照我的想法将:: float更改为:: decimal应该可以解决您的问题。 附:十进制可能需要指定它的大小f.e.十进制(127,100)

答案 2 :(得分:0)

尝试:

select cast(num1 as float) / cast(num2 as float);

这将为您提供最多2位小数(默认情况下)的结果,但会占用您的一些处理时间。做其他事情会使小数部分四舍五入。

enter image description here

答案 3 :(得分:0)