繁体   English   中英

用不同的表计算数据

[英]Count data with different table

我有 2 个表(device_a 和 device_b),我想:

  1. 将表联合到每个表并计算每个表的数据,然后按日期小时分组。
  2. 之后我想计算所有设备的数据,然后按日期小时分组。 连接表没有键。
  3. 结果显示基于按日期小时排序的 id

device_a

datetime             
2020-09-23 16:00:00   
2020-09-23 16:00:00   
2020-09-23 16:00:00   
2020-09-23 17:00:00

设备_b

datetime             
2020-09-23 16:00:00   
2020-09-23 16:00:00   
2020-09-23 17:00:00
2020-09-23 17:00:00

预期结果:

id   datehour              type        count  

1   2020-09-23 16:00:00   device_a     3
2   2020-09-23 16:00:00   device_b     2
3   2020-09-23 16:00:00   device_all   5
4   2020-09-23 17:00:00   device_a     1
5   2020-09-23 17:00:00   device_b     2
6   2020-09-23 17:00:00   device_all   3

您首先需要计算每个小时内每个设备的出现次数。 完成此操作后,您可以将该数据与设备类型列表CROSS JOIN连接,在设备类型匹配或设备类型为device_all

SELECT ROW_NUMBER() OVER (ORDER BY datehour, FIND_IN_SET(type, 'device_a,device_b,device_all')) AS id,
       d.datehour,
       t.type,
       SUM(CASE WHEN d.device = t.type OR t.type = 'device_all' THEN `count` END) AS `count`
FROM (
  SELECT 'device_a' AS type
  UNION ALL
  SELECT 'device_b'
  UNION ALL 
  SELECT 'device_all'
) t
CROSS JOIN (
  SELECT datehour,
         device,
         COUNT(*) AS count
  FROM (
    SELECT 'device_a' AS device, `datetime` AS datehour
    FROM device_a
    UNION ALL
    SELECT 'device_b', `datetime`
    FROM device_b
  ) dv
  GROUP BY datehour, device
) d
GROUP BY datehour, type 
ORDER BY datehour, FIND_IN_SET(type, 'device_a,device_b,device_all')

Output:

id  datehour                type        count
1   2020-09-23 16:00:00     device_a    3
2   2020-09-23 16:00:00     device_b    2
3   2020-09-23 16:00:00     device_all  5
4   2020-09-23 17:00:00     device_a    1
5   2020-09-23 17:00:00     device_b    2
6   2020-09-23 17:00:00     device_all  3

db-fiddle 上的演示

请注意,似乎这样的东西可能更有用:

SELECT datehour,
       SUM(device = 'A') AS device_a,
       SUM(device = 'B') AS device_b,
       COUNT(*) AS device_all
FROM (
  SELECT 'A' AS device, `datetime` AS datehour
  FROM device_a
  UNION ALL
  SELECT 'B', `datetime`
  FROM device_b
) d
GROUP BY datehour

Output:

datehour                device_a    device_b    device_all
2020-09-23 16:00:00     3           2           5
2020-09-23 17:00:00     1           2           3

db-fiddle 上的演示

尝试使用这个

SET @rownum=0;
SELECT @rownum:=@rownum+1 AS id, a.datetime, 'device_a' AS 'type',COUNT(*) AS 'count' 
FROM device_a a 
GROUP BY a.datetime
UNION
SELECT @rownum:=@rownum+1 AS id,b.datetime, 'device_b' AS 'type',COUNT(*) AS 'count' 
FROM device_b b
GROUP BY b.datetime
UNION   
SELECT @rownum:=@rownum+1 AS id, a.datetime, 'device_all' AS 'type',(COUNT(*) + (SELECT COUNT(*) FROM device_b WHERE datetime = a.datetime)) AS 'count' 
FROM device_a a 
GROUP BY a.datetime
ORDER BY `datetime` asc

结果是在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM