sql - 将列中的数组与另一个查询的计数结果相乘
问题描述
我是 Postgres 和数据库的新手,所以很抱歉。我运行了一个查询,从一张表中获取每所学校的学生人数。现在我有下表:
school_probs:
school_code(PK bigint) schoolName(text) probs(numeric)
1 CAA {0.05,0.08,0.18,0.3,0.11,0.28}
2 CAS {0.06,0.1,0.295,0.36,0.12,0.065}
3 CBA {0.05,0.11,0.35,0.32,0.12,0.05}
4 CL {0.07,0.09,0.24,0.4,0.06,0.09}
我将如何将每所学校的计数与 probs 列中的每个数字相乘。例如:我们有学校“CAA”的学生总数如果是 198,那么概率分布将是
(0.05*198, 0.08*198, 0.18*198, 0.3*198, 0.11*198, 0.28*198)
。有了结果,我就可以为学生分配成绩。
我获取计数的查询如下:
SELECT simulated_records.school, COUNT(simulated_records.school) as studentCount INTO CountSchool
FROM simulated_records, school_probs
WHERE simulated_records.school = school_probs.school
GROUP BY simulated_records.school;
解决方案
要将数组的元素与常数相乘,您需要再次取消嵌套、相乘和聚合。一些警告等待着。考虑:
最好使用ARRAY 构造函数。
也就是说,并对您未公开的表格设计做出一些假设,我还将简化计数:
到达:
SELECT *, ARRAY(SELECT unnest(p.probs) * r.student_ct) AS scaled_probs
FROM school_probs p
LEFT JOIN (
SELECT school, COUNT(*)::int AS student_ct
FROM simulated_records
GROUP BY 1
) r USING (school);
或者,将 NULL 数组表示为 NULL 数组:
SELECT *
FROM school_probs p
LEFT JOIN (
SELECT school, COUNT(*)::int AS student_ct
FROM simulated_records
GROUP BY 1
) r USING (school)
LEFT JOIN LATERAL (
SELECT ARRAY(SELECT unnest(p.probs) * r.student_ct) AS scaled_probs
) p1 ON p.probs IS NOT NULL;
db<>在这里摆弄
我建议这种简单的形式,在 SELECT 列表中仅针对 Postgres 10 或更高版本使用 set-returning 函数,因为:
推荐阅读
- python - 移动鼠标时图像位置不更新/更新较慢
- python-3.x - TypeError:drop()在删除多列时为参数“axis”获得了多个值
- fortran - 使用 gfortran (gcc8) 比较两个派生类型变量
- ios - 在 Swift 中使用 NSCoding 在分层类中进行数据持久性的最佳实践是什么?
- powerquery - Power Query 搜索整个表格,替换包含特定字符串的每个单元格值
- time - PID平滑不规则的GPS时间输入?
- excel - VBA - 如何访问 Mac Excel 上的文件夹?
- tensorflow - TensorFlow:如何在 Eager Execution 中检查梯度和权重?
- node.js - 在 Node Express 应用程序中为 Stripe 创建 webhook;发出阅读请求
- python - Python,URL NLP:如何计算 URL 字符串中的所有英文单词?