我必须为我的系统上要求的门票报告。
票证是从工作站调用的,该工作站与许多区域相关。
SELECT
DATE(q.created_at) AS DATE,
HOUR(q.created_at) AS HOUR,
ar.name AS area,
w.name AS workstation,
COUNT(DISTINCT q.id) AS count
FROM qms_queue q
JOIN qms_workstations w ON q.workstation_id = w.id
JOIN qms_area_workstation aw ON aw.workstation_id = w.id
JOIN qms_areas ar ON aw.area_id = ar.id
WHERE q.created_at
BETWEEN '2018-02-26 00:00:00'
AND '2018-02-28 23:59:59'
AND customer_id = 1
GROUP BY DATE(q.created_at), w.id, HOUR(q.created_at)
ORDER BY DATE(q.created_at), HOUR(q.created_at)
执行该查询,我得到了门票的总数。
SELECT
DATE(q.created_at) AS DATE,
HOUR(q.created_at) AS HOUR,
ar.name AS area,
w.name AS workstation,
COUNT(DISTINCT q.id) AS count
FROM qms_queue q
JOIN qms_workstations w ON q.workstation_id = w.id
JOIN qms_area_workstation aw ON aw.workstation_id = w.id
JOIN qms_areas ar ON aw.area_id = ar.id
WHERE q.created_at
BETWEEN '2018-02-26 00:00:00'
AND '2018-02-28 23:59:59'
AND customer_id = 1
GROUP BY DATE(q.created_at), w.id, HOUR(q.created_at), ar.id
ORDER BY DATE(q.created_at), HOUR(q.created_at)
但是,执行该查询会获得每个区域的绝对总计数。
我无法想出一种计算每个区域的部分计数的方法。
有人可以帮我一把吗?
在没有看到实际数据的情况下,考虑简单地运行不同的聚合,一个在Area级别,一个在Workstation级别,而不是两者。如果需要,可以按日期和小时将它们连接为派生表子查询:
区域级别
SELECT
DATE(q.created_at) AS `DATE`,
HOUR(q.created_at) AS `HOUR`,
ar.name AS `area`,
COUNT(DISTINCT q.id) AS `area_count`
...
GROUP BY DATE(q.created_at), HOUR(q.created_at), ar.name
ORDER BY DATE(q.created_at), HOUR(q.created_at)
工作站级别
SELECT
DATE(q.created_at) AS `DATE`,
HOUR(q.created_at) AS `HOUR`,
w.name AS `workstation`,
COUNT(DISTINCT q.id) AS `ws_count`
...
GROUP BY DATE(q.created_at), HOUR(q.created_at), w.name
ORDER BY DATE(q.created_at), HOUR(q.created_at)
嗨,我没有你的数据设置,但为此尝试分析功能
COUNT(q.id) OVER (PARTITION BY ar.name)
检查这是否正在为每个区域提供计数。