我有一个名为path=
的MySQL表和类似的列;
datas
示例数据:
id int(11)
currency varchar(16)
date_time (datetime)
必须像这样(在每个货币中仅用1分钟的行删除其他对象);
id currency date_time
--------- ------------ ---------------------
12 EURUSD 2019-01-28 11:19:26
13 EURUSD 2019-01-28 11:19:29
14 EURUSD 2019-01-28 11:19:34
15 EURUSD 2019-01-28 11:19:38
16 EURUSD 2019-01-28 11:19:49
17 GBPUSD 2019-01-28 11:19:23
18 GBPUSD 2019-01-28 11:19:27
19 GBPUSD 2019-01-28 11:19:39
20 GBPUSD 2019-01-28 11:19:45
21 GBPUSD 2019-01-28 11:19:57
我的程序大约每3-6秒插入一行。 但我想在1分钟内只保留1种货币的价格,并且我想删除其他货币。
我该如何使用mysql查询呢? 我正在使用php。
我的Cron工作每15分钟工作一次。使用php将可以执行此查询。
Mysql版本= 5.7.25
感谢创意。
答案 0 :(得分:1)
您可以使用此:
DELETE FROM t
WHERE (currency, date_time) NOT IN (
SELECT * FROM (
SELECT currency, MIN(date_time)
FROM t
GROUP BY currency, UNIX_TIMESTAMP(date_time) - UNIX_TIMESTAMP(date_time) % (1 * 60)
) AS x
)
表达式UNIX_TIMESTAMP(datetime) - UNIX_TIMESTAMP(datetime) % (n * 60)
将datetime值设置为n * 60秒边界as described here。您可以按此表达式分组以在每个组中找到currency, MIN(datetime)
对。
答案 1 :(得分:0)
您可以在下面尝试-
delete b from datas b join
(
SELECT
@row_number:=CASE
WHEN @currency = currency THEN @row_number + 1
ELSE 1
END AS num,id
@currency:=currency as currency,date_time
FROM
datas,(SELECT @currency:=0,@row_number:=0) as t
ORDER BY currency
)A on a.id=b.id where num<>1
答案 2 :(得分:0)
您可以按分钟和货币使用NOT IN的最小ID(如果愿意,也可以使用最大ID)分组
delete from my_table
where id NOT IN (
select my_id
from (
select min(id) my_id
from my_table
GROUP BY currency
, YEAR(date_time)
, month(date_time)
, day(date_time)
, HOUR(date_time)
, MINUTE(date_time)
) T
)