Удалить строки старше 10-ти периодов в каждой группе - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть таблица с 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 голосов
/ 26 апреля 2018

В 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
               );
0 голосов
/ 26 апреля 2018

Я в основном работаю с 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 псевдонимом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...