小编Kyl*_*yle的帖子

为多个表中的数据创建摘要行

我正在尝试编写SQL查询以生成给定时间段内给定用户执行的操作的摘要行.我有以下相关的表结构:

用户

  • ID
  • 球队

audit_periods(可以处理,运输,休息等)

  • 用户身份
  • period_type(可以是"处理","运送"等 - 目前尚未规范化)
  • started_at
  • finished_at(对于当前时期可以为null,因此逻辑在下面的时间)

audit_tasks

  • audit_period_id
  • audit_task_type_id
  • created_at
  • 得分了

audit_task_types

  • 名称("扫描","place_in_pallet"等)
  • 得分(似乎多余,但我们需要保持audit_task在执行时收到的分数,因为audit_task_type分数可以在以后更改)

ER图

对于给定时期内的每个用户,我想创建类似以下数据行的内容:

users.id users.email time_spent_processing time_spent_shipping ... number_of_scans number_of_pallets

这将通过计算每个用户来计算:

  • audit_periods至少部分落在期望的窗口中?(使用started_at和finished_at.)
  • 用户在每种audit_period中花费了多长时间?(应该通过audit_periods.period_type参与分组,我想.)
  • audit_tasks属于所需窗口的范围?(使用created_at - 不在下面的代码中.)
  • 用户在窗口期间完成了每种类型的audit_task中有多少个?(加入audit_task_type,可能涉及audit_task_types.name上的一个组.)
  • 在这段时间内赚了多少积分?(汇总窗口中所有audit_tasks的分数.)

我已经筋疲力尽了所有我知道的SQL技巧(并不多),并提出了类似以下的内容:

select 
    u.id as user_id,
    u.email as email,
    u.team as team,
    ap.period_type as period_type,
    att.name,
    time_to_sec(
      timediff(least("2011-03-17 00:00:00", ifnull(ap.finished_at, utc_timestamp())), greatest("2011-03-16 00:00:00", ap.started_at))
    ) as period_duration,
    sum(at.score) as period_score
  from audit_periods as ap
  inner join users as u on ap.user_id = u.id
  left join audit_tasks …
Run Code Online (Sandbox Code Playgroud)

mysql sql

9
推荐指数
1
解决办法
1585
查看次数

标签 统计

mysql ×1

sql ×1