MySQL - 在一分钟内枚举所有行并保留第一行
MySQL - Enumerate all rows within a minute and keep the first one
我有一个 MySQL table 包含以下列:
+----------------+-------------+------+-----+---------+----------------+
| 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;
我尝试使用此查询在一分钟内枚举所有行,然后每分钟保留第一行。但这不起作用,它只是将 1 放入每一行的 seqnum 中,并且没有得到完全删除任何行。
任何人都可以帮助我使这个查询工作并保持每分钟的第一行吗?
提前致谢!
我不知道为什么第一个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
中表达式的求值顺序。如果您有多个带有变量赋值的表达式,那么它们的计算顺序可能会错误。
我有一个 MySQL table 包含以下列:
+----------------+-------------+------+-----+---------+----------------+
| 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;
我尝试使用此查询在一分钟内枚举所有行,然后每分钟保留第一行。但这不起作用,它只是将 1 放入每一行的 seqnum 中,并且没有得到完全删除任何行。
任何人都可以帮助我使这个查询工作并保持每分钟的第一行吗?
提前致谢!
我不知道为什么第一个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
中表达式的求值顺序。如果您有多个带有变量赋值的表达式,那么它们的计算顺序可能会错误。