簡體   English   中英

在每個組下刪除超過10個時間段的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM