我有一个包含2列的表
+---------+------------+
| symbol | ts |
+---------+------------+
| 1 | 1524696300 |
| 1 | 1524697200 |
| 1 | 1524698100 |
| 1 | 1524699000 |
| 1 | 1524699900 |
| 1 | 1524700800 |
| 1 | 1524701700 |
| 1 | 1524702600 |
| 1 | 1524703500 |
| 1 | 1524704400 |
| 1 | 1524705300 |
| 1 | 1524706200 |
| 2 | 1524697200 |
| 2 | 1524698100 |
| 2 | 1524699000 |
| 2 | 1524699900 |
+---------+------------+
我想在每个组下删除超过10行,每行相隔900秒,并且在第一行和最后一行可能有不同的时间戳值但是900的差异保持不变
我试过了这个查询
sqlite> select * from ohlc2 where ts < (select max(ts) from ohlc2) - 8100;
它只适用于整个表,而不是每组,因此如果我的第1项和第2项具有不同的开始和结束时间戳,则上述方法不起作用
我在此查询中收到错误,我现在尝试
sqlite> with m as (select symbol, max(ts) from ohlc2 group by symbol) select * from ohlc2 where symbol = m.symbol and ts < m.max - 8100;
如何删除每组超过10个时间戳的所有行?
答案 0 :(得分:2)
在SQLite中,您可以使用相关子查询执行此操作:
delete ohlc2
where ts < (select o2.ts
from ohlc2 o2
where o2.symbol = ohlc2.symbol
order by o2.ts desc
limit 1 offset 9
);
答案 1 :(得分:0)
我主要使用MS SQL Server,所以我不知道SQLLite是否支持这种语法,但如果这是SQLLite中的有效语法,那么它应该可以工作:
DELETE T1
FROM OHLC2 T1
INNER JOIN
(
SELECT
symbol,
MAX(ts) AS max_ts
FROM
OHLC2
) SQ ON SQ.symbol = T1.symbol AND SQ.max_ts > T1.ts + 8100
您也应该使用CTE,但是您需要在CTE中使用别名命名第二列。