Если у вас нет представления о количестве островов, используйте это решение подхода Dynami c. вот демонстрация .
with cte as
(
select
*,
id - row_number() over (order by id) as rnk
from myTable
where spike > 10
),
islands as
(
select
*,
(select count(distinct rnk)::int from cte) as total_islands
from cte
),
buckets as
(
select
Id,
name,
spike,
timestamp,
NTILE(total_islands) Over (Order by id) as island
from islands
)
select *
from buckets
where island = 2
для вашего случая вы можете напрямую использовать оконную функцию NTILE
, которая разделит ваши данные на две части. Вот демонстрация .
сначала создайте cte
with cte as
(
select
Id,
name,
spike,
timestamp,
NTILE(2) Over (Order by id) as nums
from myTable
where spike > 10
)
Затем запустите первый запрос, чтобы получить первую часть
select
Id,
name,
spike,
timestamp
from cte
where nums = 1;
Вывод:
| id | name | spike | timestamp |
| --- | ---- | ----- | --------- |
| 1 | John | 15 | 111 |
| 2 | Jim | 12 | 112 |
| 3 | Jeff | 13 | 113 |
Теперь запустите второй запрос, чтобы получить вторую часть
select
Id,
name,
spike,
timestamp
from cte
where nums = 2;
Вывод:
| id | name | spike | timestamp |
| --- | ---- | ----- | --------- |
| 7 | Jey | 13 | 117 |
| 8 | Joy | 15 | 118 |
| 9 | Jess | 14 | 119 |