MySQL - 在一个月的每一天选择最接近某一时间的行

时间:2012-03-19 15:43:26

标签: mysql

假设我有一个包含两列的表

TIMESTAMP类型的TimeStamp

FLOAT类型

此表由外部应用程序创建和更新,因此插入和更新不受我的控制。表格设计不能以任何方式改变。

我需要做的是选择在过去一个月中每天最靠近和早上10点之前的每个条目。

提前致谢。

1 个答案:

答案 0 :(得分:1)

内部预查询应该在您当前所在月份之前每年/每月进行。这是由格式化的“YYYY-MM-01”日期创建的SQLVariable强制执行的,例如今天。 .. 2012-03-19,只保留年/月但强制01.这也意味着时间戳为凌晨12:00:00(午夜)。 NEXT @变量用于确定刚刚计算出的那个月的第一个月...因此2012-02-01。这将根据您的时间戳/浮点值表格查询WHERE子句的变量。

现在,您可以获得最大时间,仅按时间戳的公共日期部分进行分组,但保留条目的HOUR()在上午10点之前的条目的完整实际日期和时间...

从那里,重新加入到原始表格,其中FINAL“LastPerDay”时间与每天匹配。现在,如果同一天的实际上一个时间戳条目实际上具有多个精确时间条目,并且hh:mm:ss(或任何精度)的粒度

,则可以获得多个条目
select
      PreQuery.JustTheDate,
      YT2.FloatColumnName
   from
      ( select
              Date_Format( YT.TimeStampColumn, '%Y-%m-%d' ) JustTheDate,
              max( YT.TimeStampColumn ) as LastPerDay
           from
              ( select @FirstOfThisMonth := Date_Format( '%Y-%m-01' ),
                       @FirstOfPriorMonth := Date_Sub( @FirstOfThisMonth, interval 1 month ) ) sqlvars,
              YourTable YT
           where
                  YT.TimeStampColumn >= @FirstOfPriorMonth
              AND YT.TimeStampColumn < @FirstOfThisMonth
              AND Hour( YT.TimeStampColumn ) < 10
           group by
              `JustTheDate`
           order by
              `JustTheDate` DESC ) PreQuery

      JOIN YourTable YT2
         ON PreQuery.LastPerDay = YT2.TimeStampColumn