1

我有一个包含以下列的 MySQL 表:

+----------------+-------------+------+-----+---------+----------------+
| Field          | Type        | Null | Key | Default | Extra          |
+----------------+-------------+------+-----+---------+----------------+
| id             | int(11)     | NO   | PRI | NULL    | auto_increment |
| date           | varchar(11) | NO   |     | NULL    |                |
| time           | varchar(12) | NO   |     | NULL    |                |
| gmt_offset     | varchar(2)  | YES  |     | NULL    |                |
| type           | varchar(10) | YES  |     | NULL    |                |
| yield_b        | varchar(10) | YES  |     | NULL    |                |
| yield_d        | varchar(10) | YES  |     | NULL    |                |
+----------------+-------------+------+-----+---------+----------------+

我正在尝试使用以下查询保持每分钟一行(每分钟的第一行):

create table temp_table1 as
    select t.*
    from (select t1.*,
                 (@rn := if(@prevd <> date or minute(time) <> @prevm, 1,
                            if(@prevd := date, if(@prevm := minute(time), 1, 1), 1)
                           )
                 ) as seqnum
          from table1 t1 cross join
               (select @rn := 0, @prevd := 0, @prevm := 0) vars
          order by date, time
         ) t
     where seqnum = 1;


truncate table table1;

insert into table1(col1, . . ., coln)
    select col1, . . . , coln
    from temp_table1;

我尝试使用此查询在一分钟内枚举所有行,然后每分钟保留第一行。但这不起作用,它只是在每行的 seqnum 中放入 1,并且不会删除任何行全部。

任何人都可以帮助我使这个查询工作并保持每分钟的第一行吗?

提前致谢!

4

1 回答 1

0

我不知道为什么逻辑在第一个中被颠倒了if()。我想我很困惑。对此表示歉意。

create table temp_table1 as
    select t.*
    from (select t1.*,
                 (@rn := if(@prevd = date and minute(time) = @prevm, @rn + 1,
                            if(@prevd := date, if(@prevm := minute(time), 1, 1), 1)
                           )
                 ) as seqnum
          from table1 t1 cross join
               (select @rn := 0, @prevd := 0, @prevm := 0) vars
          order by date, time
         ) t
     where seqnum = 1;

这种情况下变量赋值的逻辑是:

  • 第一个子句进行比较并增加@rn值。
  • 接下来的子句使用嵌套if()调用分配变量的新值,所有可能性都返回 1。

将所有赋值放在一个表达式中的目的不是创建任意复杂的 SQL。MySQL 不保证select. 如果您有多个带有变量赋值的表达式,那么它们可能会以错误的顺序进行计算。

于 2015-01-20T13:16:04.330 回答