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