在同一列内相乘
Posted
技术标签:
【中文标题】在同一列内相乘【英文标题】:Multiply within same column 【发布时间】:2021-06-16 14:32:17 【问题描述】:我有一个如下所示的表格:
label | value |
---|---|
student1 | 90 |
student2 | 88 |
student3 | 59 |
student4 | 77 |
如果两个值满足条件,我会尝试将它们相乘。 例如,我想将学生 1 和 3 的值相乘。然后我想将学生 2 和 4 的值相乘。
对于第一个条件,我尝试了以下代码:
select
case
when
max(label) = "student1" or max(label) = "student3" then exp(SUM(log(value))) else 0 end as nominator
from four_students_table
不幸的是,它给了我 0 的值。我也尝试将它们加在一起,但又得到了 0。我不确定我在这里做错了什么。
预期输出:
numerator | denominator |
---|---|
5,310 | 6,776 |
【问题讨论】:
显示预期输出 将其添加到问题@MikhailBerlyant 只有4个学生吗?您在共享的sql
中使用了列calc
,但这在您的共享数据集中不存在。什么是calc
?
@ggordon 是的,只有 4 名学生。
抱歉,“calc”应该是“value”。我现在要修复它。但即便如此,我仍然得到 0
【参考方案1】:
如下例所示,我 case statement
将有助于过滤您想要聚合的内容。
以下小提琴提供了您想要的结果:
CREATE TABLE four_students_table (
label VARCHAR(8),
value INTEGER
);
INSERT INTO four_students_table
(label, value)
VALUES
('student1', '90'),
('student2', '88'),
('student3', '59'),
('student4', '77');
查询 #1
SELECT
SUM(CASE WHEN label='student1' THEN value ELSE 0 END)*
SUM(CASE WHEN label='student3' THEN value ELSE 0 END) as nominator,
SUM(CASE WHEN label='student2' THEN value ELSE 0 END)*
SUM(CASE WHEN label='student4' THEN value ELSE 0 END) as denominator
FROM
four_students_table;
nominator | denominator |
---|---|
5310 | 6776 |
View on DB Fiddle
【讨论】:
【参考方案2】:考虑以下(我觉得这更符合您在问题中的意图/示例)
select distinct
round(exp(sum(if(label in ('student1', 'student3'), ln(value), 0)) over())) as nominator,
round(exp(sum(if(label in ('student2', 'student4'), ln(value), 0)) over())) as denominator
from `project.dataset.four_students_table`
如果应用于您问题中的样本数据 - 输出是
【讨论】:
以上是关于在同一列内相乘的主要内容,如果未能解决你的问题,请参考以下文章