MySQL Query缺少行

时间:2016-01-06 14:12:23

标签: mysql sql

所以我需要一些帮助。我似乎无法找到正确的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 Fiddle

编辑:添加了SQL小提琴链接

1 个答案:

答案 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'