我并不是在寻找完整的答案,但也许是一些关于我应该查看哪种 mysql 命令来解决这个问题的提示。
我有一系列传感器(30 多个)连接到我的网络。在不同的时间间隔,我请求它们的状态,每个设备都会回复 n 个 bool 值,其中 n 可以是从 0 到 120 的任何值(因此响应可以是一个空对象、120 个 bool 值的列表或之间的任何值) )。
根据收到的 bool 值,我创建一条新记录,以及设备的 MAC 地址和时间戳。例如(see also this sqlfiddle):
+----+-------------------+---------------------+--------+
| id | device_address | timestamp | status |
+----+-------------------+---------------------+--------+
| 1 | f2:49:d2:17:5d:8d | 2018-09-22 15:54:51 | 0 |
| 2 | fd:30:ec:08:67:9a | 2018-09-22 15:54:56 | 0 |
| 3 | f8:8d:d9:64:a4:7c | 2018-09-22 15:54:58 | 1 |
| 4 | f2:49:d2:17:5d:8d | 2018-09-22 15:55:51 | 0 |
| 5 | f2:49:d2:17:5d:8d | 2018-09-22 15:55:52 | 0 |
| 6 | fd:30:ec:08:67:9a | 2018-09-22 15:55:56 | 1 |
| 7 | f8:8d:d9:64:a4:7c | 2018-09-22 15:55:58 | 1 |
| 8 | f2:49:d2:17:5d:8d | 2018-09-22 15:56:52 | 0 |
| 9 | f2:49:d2:17:5d:8d | 2018-09-22 15:57:52 | 1 |
| 10 | f2:49:d2:17:5d:8d | 2018-09-22 15:58:52 | 1 |
+----+-------------------+---------------------+--------+
或者,替换 MAC 地址以获得更好的可读性:
+----+-------------------+---------------------+--------+
| id | device_address | timestamp | status |
+----+-------------------+---------------------+--------+
| 1 | A | 2018-09-22 15:54:51 | 0 |
| 2 | BB | 2018-09-22 15:54:56 | 0 |
| 3 | CCC | 2018-09-22 15:54:58 | 1 |
| 4 | A | 2018-09-22 15:55:51 | 0 |
| 5 | A | 2018-09-22 15:55:52 | 0 |
| 6 | BB | 2018-09-22 15:55:56 | 1 |
| 7 | CCC | 2018-09-22 15:55:58 | 1 |
| 8 | A | 2018-09-22 15:56:52 | 0 |
| 9 | A | 2018-09-22 15:57:52 | 1 |
| 10 | A | 2018-09-22 15:58:52 | 1 |
+----+-------------------+---------------------+--------+
最后,我希望能够绘制这些值的图表,并按时间间隔分组。例如,当我绘制最近 2 小时数据的图表时,我想使用 5 分钟间隔。每个时间间隔我想知道有多少(唯一)设备在该时间段内至少有一次状态为 1,以及有多少设备只有 0。根本不出现在时间 block 内的设备(因为它们没有返回 bool 值)与该时间 block 无关
上述记录将落在这样的 5 分钟时间 block 中的两个内:
- 15:50:00 至 15:54:59 - ID 1 2 3
- 15:55:00 至 15:59:59 - ID 4 5 6 7 8 9 10
我想要的回复是这样的:
+---------------------+---------------------------------+-------------------------+
| timeblock start | dev w/ at least one status of 1 | dev w/ only status of 0 |
+---------------------+---------------------------------+-------------------------+
| 2018-09-22 15:50:00 | 1 | 2 |
| 2018-09-22 15:55:00 | 2 | 1 |
+---------------------+---------------------------------+-------------------------+
最终结果不必完全像这样,可以帮助我推断这些数字的其他结果也可以。时间戳字段也是如此;这种 2018-09-22 15:50:00
格式会很棒,但其他格式也可以让我扣除时间 block 。
这样做可以让我获得不同的时间 block 以及每个时间 block 内唯一设备的数量,但它会计算 1 和 0 的总数,而不是合并每个唯一设备的结果。
SELECT timestamp,
SUM(status) as ones, COUNT(status)-SUM(status) as zeroes,
COUNT(DISTINCT(device_address)) as unique_devices
FROM records
GROUP BY UNIX_TIMESTAMP(timestamp) DIV 300
ORDER BY timestamp ASC
结果:
+----------------------+------+--------+----------------+
| timestamp | ones | zeroes | unique devices |
+----------------------+------+--------+----------------+
| 2018-09-22T15:54:51Z | 1 | 2 | 3 |
| 2018-09-22T15:57:52Z | 4 | 3 | 3 |
+----------------------+------+--------+----------------+
最佳答案
使用条件聚合
SELECT timestamp,
count(distinct case when status = 1 then device_address end) as ones,
count(distinct case when status = 0 then device_address end) as zeros,
FROM records
GROUP BY UNIX_TIMESTAMP(timestamp) DIV 300
ORDER BY timestamp ASC
关于mysql - 获取具有特定值的记录数量,但每个唯一字段仅获取一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52493723/