[英]Delete rows older than 10 time periods under each group
我有一张两列的桌子
+---------+------------+
| 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个时间戳的行?
在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
);
我主要使用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中的第二列命名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.