[英]Count data with different table
我有 2 个表(device_a 和 device_b),我想:
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
请注意,似乎这样的东西可能更有用:
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
尝试使用这个
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.