所以我需要一些帮助。我似乎无法找到正确的JOIN或我需要的任何东西,以便获得我正在寻找的所有结果。
我目前的查询如下:
SELECT
COUNT(hd.value) as total_rows,
ROUND(AVG(hd.value), 2) as OEE_AVG,
dl.line_id,
hd.shift,
ol.description
FROM
dashboard_to_dashboard_lines ddl
JOIN dashboard_lines dl ON dl.id = ddl.dashboard_line_id
LEFT OUTER JOIN operation_lines ol ON (dl.line_id = ol.line_id)
JOIN historical_data hd ON dl.gauge_tag_id = hd.tag_id
WHERE
hd.timestamp BETWEEN '2016-01-04 00:00:00' AND '2016-01-04 23:59:59'
AND ddl.dashboard_id = 1
AND hd.value < 200
GROUP BY
dl.line_id,
hd.shift
ORDER BY
hd.shift,
dl.line_id ASC
期望的结果如下:
________________________________________________________
| total rows | oee_avg | line_id | shift | description |
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
| 858 | 80.24 | 1 | 1 | Line Desc |
| 432 | 60.21 | 2 | 1 | Line Desc |
| 234 | 70.75 | 3 | 1 | Line Desc |
| 865 | 10.45 | 1 | 2 | Line Desc |
| 864 | 20.26 | 2 | 2 | Line Desc |
| 823 | 30.44 | 3 | 2 | Line Desc |
| 423 | 56.14 | 1 | 3 | Line Desc |
| 234 | 12.74 | 2 | 3 | Line Desc |
| 534 | 43.64 | 3 | 3 | Line Desc |
基本上,我得到了与按班次分隔的仪表板相关联的每一行的值的平均值。
我主要获得我需要的数据,除了1行,在提供的时间范围内在1个班次。 (其他时间范围提供了所有班次中所有线路的预期结果)。所以我假设计算中没有数据会导致行被遗漏。
我试着做一个外连接(在查询中混合和匹配)没有任何运气。
我知道没有一个SQL小提琴很难,但我希望有人可能会有一些帮助我的见解。
提前致谢。
编辑:添加了SQL小提琴链接
答案 0 :(得分:0)
如果没有样本数据我无法测试,但如果它没有完全发挥作用,这应该指向正确的方向。重要的是,您需要一个可用的所有可能的线/移位组合的源。在这种情况下,我使用了一个子查询来对付你的表而不限制日期等,但你可能有更好的方法来获取它们。此外,在类似情况下,对于您仍希望在报表上查看内容的某些值,数据可能根本不存在。例如,如果我按天报告销售额并且商店在周日关闭,但我仍然希望看到当天的零。在这种情况下,除了从现有表中进行选择之外,还需要以其他方式创建值。
SELECT
COUNT(hd2.value) AS total_rows,
ROUND(AVG(hd.value), 2) AS OEE_AVG,
SQ.line_id,
SQ.shift,
OL.description
FROM
(
SELECT DISTINCT dl.line_id, hd.shift
FROM dashboard_lines dl
INNER JOIN historical_data hd ON hd.tag_id = dl.gauge_tag_id
) SQ
INNER JOIN dashboard_to_dashboard_lines ddl ON ddl.dashboard_id = 1
LEFT OUTER JOIN dashboard_lines dl2 ON
dl2.id = ddl.dashboard_line_id AND
dl2.line_id = SQ.line_id
LEFT OUTER JOIN historical_data hd2 ON
hd2.tag_id = dl.gauge_tag_id AND
hd2.shift = SQ.shift AND
hd2.timestamp BETWEEN '2016-01-04 00:00:00' AND '2016-01-04 23:59:59' AND
hd2.value < 200
LEFT OUTER JOIN operation_lines ol ON ol.line_id = dl2.line_id
GROUP BY
SQ.line_id,
SQ.shift
ORDER BY
SQ.shift,
SQ.line_id ASC
另外,请注意,如果MySQL要保持精度超过秒,那么检查时间戳列可能会导致错误的结果。最好使用hd2.timestamp >= '2016-01-04 00:00:00' AND hd2.timestamp < '2016-01-05 00:00:00'