我正在使用以下命令在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
?
任何帮助都将不胜感激。
答案 0 :(得分:1)
方法1 - 我遇到了同样的问题!在我的情况下,它是百万行,所以我将结果乘以10000.
每当我想从该列中选择值时,我将在select语句中除以10000以使其均匀。我知道它不是完美的解决方案,但对我有用。
方法2 - 我创建了一个带有数字(12,6)数据类型的样本表,当我导入类似于你的结果集时,我可以看到浮点值最多为6位小数。
<登记/>
我猜,当你使用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位小数(默认情况下)的结果,但会占用您的一些处理时间。做其他事情会使小数部分四舍五入。
答案 3 :(得分:0)