我在哪里出错? cum_duration应生成activity_duration的累积值,但它会返回与activity_duration相同的值。如何获得累积值?
SELECT
fact_daily_summary.day_date,
fact_daily_summary.day_number,
fact_activity.activity_duration/3600 AS activity_duration,
(SELECT
SUM(fc.activity_duration)/3600
FROM fact_activity fc
WHERE fc.fact_activity_uid = fact_activity.fact_activity_uid
AND fc.fact_activity_uid <= fact_activity.fact_activity_uid
GROUP BY fact_activity.fact_activity_uid
ORDER BY fact_activity.fact_activity_uid)
AS cum_duration,
depth_md_msl
FROM
fact_daily_summary,
fact_activity
WHERE fact_activity.daily_uid = fact_daily_summary.daily_uid
AND fact_daily_summary.operation_uid = fact_operation_summary.operation_uid
结果
day_date day_number activity_duration cum_duration depth_md_msl
------------------- ---------- ----------------- ------------ --------------
2012-06-17 00:00:00 2 0.500000 0.500000 -1025.15
2012-06-17 00:00:00 2 1.500000 1.500000 -1025.15
2012-06-17 00:00:00 2 0.500000 0.500000 -1025.15
2012-06-17 00:00:00 2 1.500000 1.500000 -1017.15
2012-06-17 00:00:00 2 19.000000 19.000000 -998.65
2012-06-17 00:00:00 2 0.499722 0.499722 -998.65
2012-06-17 00:00:00 2 0.249722 0.249722 -998.65
2012-06-17 00:00:00 2 0.249722 0.249722 -998.55
2012-06-17 00:00:00 2 0.500000 0.500000 -1025.15
2012-06-17 00:00:00 2 1.500000 1.500000 -1025.15
2012-06-17 00:00:00 2 0.500000 0.500000 -1025.15
2012-06-17 00:00:00 2 1.500000 1.500000 -1017.15
2012-06-17 00:00:00 2 19.000000 19.000000 -998.65
2012-06-17 00:00:00 2 0.499722 0.499722 -998.65
2012-06-17 00:00:00 2 0.249722 0.249722 -998.65
2012-06-17 00:00:00 2 0.249722 0.249722 -998.55
2012-06-17 00:00:00 2 0.500000 0.500000 -1025.15
2012-06-17 00:00:00 2 1.500000 1.500000 -1025.15
2012-06-17 00:00:00 2 0.500000 0.500000 -1025.15
答案 0 :(得分:0)
我认为你只需要在子查询中使用日期。好吧,group by
也是不必要的:
SELECT fds.day_date, fds.day_number,
fa.activity_duration/3600 AS activity_duration,
(SELECT SUM(fc2.activity_duration)/3600
FROM fact_activity fc2
WHERE fc2.fact_activity_uid = fa.fact_activity_uid AND
fc2.day_date <= fa.day_date
) as cum_duration,
depth_md_msl
FROM fact_operation_summary fos JOIN
fact_daily_summary fds
ON fds.operation_uid = fos.operation_uid JOIN
fact_activity fa
ON fa.daily_uid = fds.daily_uid;
注意我还修复了FROM
子句以使用显式JOIN
语法。简单规则:切勿在{{1}}子句中使用逗号。
答案 1 :(得分:0)
从MySQL 8开始,理想的是使用window functions计算累计和。您的查询可以这样写:
SELECT
fds.day_date,
fds.day_number,
fa.activity_duration / 3600 AS activity_duration,
-- Window function here
SUM (fa.activity_duration / 360) OVER (PARTITION BY fa.fact_activity_uid ORDER BY day_date)
AS cum_duration,
depth_md_msl
FROM
fact_daily_summary fds,
fact_activity fa,
fact_operation_summary fos
WHERE fa.daily_uid = fds.daily_uid
AND fds.operation_uid = fos.operation_uid