删除每组下10个以上时段的行

时间:2018-04-26 14:22:13

标签: sql sqlite

我有一个包含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个时间戳的所有行?

2 个答案:

答案 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中使用别名命名第二列。