source | voltage | timestamp
CIRCUIT1 | 2.4 | XXX
CIRCUIT1 | 2.4 | XXX
CIRCUIT1 | 2.5 | XXX
CIRCUIT1 | 2.4 | XXX
CIRCUIT1 | 2.4 | XXX
CIRCUIT1 | 2.6 | XXX
CIRCUIT1 | 2.4 | XXX
CIRCUIT1 | 2.4 | XXX
CIRCUIT1 | 2.4 | XXX
CIRCUIT2 | 2.4 | XXX
CIRCUIT2 | 2.5 | XXX
CIRCUIT2 | 2.4 | XXX
CIRCUIT2 | 2.4 | XXX
CIRCUIT2 | 2.5 | XXX
CIRCUIT2 | 2.4 | XXX
CIRCUIT2 | 2.5 | XXX
CIRCUIT2 | 2.4 | XXX
CIRCUIT2 | 2.5 | XXX
CIRCUIT3 | 2.4 | XXX
CIRCUIT3 | 2.4 | XXX
CIRCUIT3 | 2.8 | XXX
CIRCUIT3 | 2.4 | XXX
CIRCUIT3 | 2.4 | XXX
CIRCUIT3 | 2.8 | XXX
CIRCUIT3 | 2.4 | XXX
CIRCUIT3 | 2.4 | XXX
CIRCUIT3 | 2.4 | XXX
输出应该只是 CIRCUIT2
CIRCUIT1 的电压值仅变化 2 倍 CIRCUIT2 的电压值变化 4 倍 尽管变化很大,CIRCUIT3 的电压值仅变化 2 次p>
谁能告诉我如何继续编写一个将输出 CIRCUIT2 作为答案的 SQL 查询?
(我又添加了一列 TIMESTAMP)
最佳答案
这是一种方法(不确定这是在 Mysql
中执行此操作的最佳方法)
SELECT *
FROM tabtest
WHERE source = (SELECT a.source
FROM (SELECT a.source,a.voltage,a.timestamp,Count(*) AS rn
FROM tabtest a
JOIN tabtest b
ON a.source = b.source
AND a.timestamp >= b.timestamp
GROUP BY a.source,a.voltage,a.timestamp) a
LEFT JOIN (SELECT a.source,a.voltage,a.timestamp,Count(*) AS rn
FROM tabtest a
JOIN tabtest b
ON a.source = b.source
AND a.timestamp >= b.timestamp
GROUP BY a.source,a.voltage,a.timestamp) b
ON a.source = b.source
AND a.rn = b.rn + 1
GROUP BY a.source
ORDER BY Sum(CASE WHEN a.voltage <> COALESCE(b.voltage, a.voltage) THEN 1 ELSE 0 END) DESC Limit 1)
<小时/>
这里的想法是找到source
中每条记录的先前电压
值,然后仅当当前记录与先前记录相比发生变化时才使用条件聚合对记录进行计数。
使用窗口函数 http://rextester.com/PJFL7743 就容易得多
关于mysql - 查询查找最频繁更改的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45396979/