摘要查询返回重复值MySQL

问题描述 投票:1回答:2

我必须为我的系统上要求的门票报告。

票证是从工作站调用的,该工作站与许多区域相关。

  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)

但是,执行该查询会获得每个区域的绝对总计数。

我无法想出一种计算每个区域的部分计数的方法。

有人可以帮我一把吗?

mysql sql group-by count aggregate
2个回答
0
投票

在没有看到实际数据的情况下,考虑简单地运行不同的聚合,一个在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)

-1
投票

嗨,我没有你的数据设置,但为此尝试分析功能

COUNT(q.id) OVER (PARTITION BY  ar.name)

检查这是否正在为每个区域提供计数。

© www.soinside.com 2019 - 2024. All rights reserved.