SQL查询min(y)max(y)和X over group by

时间:2017-04-26 08:28:56

标签: mysql sql mysql-5.5

我有一个非常简单的名为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。

任何帮助将不胜感激:) 它看起来像一个大学教程,但现在已经远远落后于我:(

1 个答案:

答案 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

最好的解决方案是首先通过将所有表转储到临时表中来清理表,使用正确的结构重新创建表并使用转换转储回来。之后你的要求应该更简单。