如何使用SQL

时间:2016-04-06 01:44:08

标签: mysql sql

我在哪里出错? 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

2 个答案:

答案 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
相关问题