我有一个非常简单的名为MYTABLE的表:
TSTAMP VARCHAR(20), VALUE VARCHAR(20)
时间戳类似于yyyy-mm-ddTHH:MM:SS.zzzZ(例如:2017-04-25T12:23:00.000Z)。 价值是一个浮动。
我知道这个表格模型很糟糕,但很多年前它已经由其他明显不知道他/她在做什么的人做过。
我正在尝试编写一个有效的查询来获取最小值(VALUE),最大值(VALUE)及其TIMESTAMP的时间间隔(例如:每分钟的最小值/最大值)。 我可以使用以下查询获取最小值和最大值,但我看不到获取时间戳的方法。
SELECT MIN(tstamp)
, MAX(tstamp)
, MIN(value) minVal
, MAX(value) max
, ABS(TRUNCATE(((UNIX_TIMESTAMP(tstamp)*1000+SUBSTR(tstamp,-4,3)) - 1493115780000)/20000,0)) intervalNumber
, tstamp
FROM mytable
WHERE tstamp BETWEEN '2017-04-25T12:23:00.000Z' AND '2017-04-25T12:24:00.000Z'
AND NOT tstamp = '2017-04-25T12:24:00.000Z'
GROUP
BY intervalNumber;
WHERE 1493115780000是以下结果:
SELECT UNIX_TIMESTAMP('2017-04-25T12:23:00.000Z')*1000+SUBSTR('2017-04-25T12:23:00.000.000Z',-4,3);
*编辑,因为我没有正确解释 我得到的是每个间隔: 第一个时间戳,lasttimestamp,min值,maxvalue,internval number,first timestamp
我想要的是: 最小值的时间戳,最大值的时间戳,最小值,最大值,间隔号
我正在使用Mysql 5.5。
任何帮助将不胜感激:) 它看起来像一个大学教程,但现在已经远远落后于我:(
答案 0 :(得分:0)
假设ABS(TRUNCATE(((UNIX_TIMESTAMP(TSTAMP)*1000+SUBSTR(TSTAMP,-4,3)) - 1493115780000)/20000,0)) as intervalNumber
是正确的。
我认为你正在寻找类似的东西:
-- Min value
SELECT top 1 min(TSTAMP), VALUE,
ABS(TRUNCATE(((UNIX_TIMESTAMP(TSTAMP)*1000+SUBSTR(TSTAMP,-4,3)) - 1493115780000)/20000,0)) as intervalNumber
FROM MYTABLE
WHERE TSTAMP between '2017-04-25T12:23:00.000Z' AND '2017-04-25T12:24:00.000Z'
AND NOT TSTAMP='2017-04-25T12:24:00.000Z'
GROUP BY VALUE desc
-- Max value
SELECT top 1 max(TSTAMP), VALUE,
ABS(TRUNCATE(((UNIX_TIMESTAMP(TSTAMP)*1000+SUBSTR(TSTAMP,-4,3)) - 1493115780000)/20000,0)) as intervalNumber
FROM MYTABLE
WHERE TSTAMP between '2017-04-25T12:23:00.000Z' AND '2017-04-25T12:24:00.000Z'
AND NOT TSTAMP='2017-04-25T12:24:00.000Z'
GROUP BY VALUE asc
最好的解决方案是首先通过将所有表转储到临时表中来清理表,使用正确的结构重新创建表并使用转换转储回来。之后你的要求应该更简单。