sql - 如何遍历 SQL 表并选择数据中的峰值?
问题描述
可以说我有下表:
Id|name|spike|timestamp
1 |John|15 |111
2 |Jim |12 |112
3 |Jeff|13 |113
4 |Joe |4 |114
5 |Jess|0 |115
6 |Jill|0 |116
7 |Jey |13 |117
8 |Joy |15 |118
9 |Jess|14 |119
10|Joe |0 |120
我需要遍历表并选择数据,spike > 10
并将行分成不同的数据集。对顶层表的可接受查询应导致:
Id|name|spike|timestamp
1 |John|15 |111
2 |Jim |12 |112
3 |Jeff|13 |113
和
Id|name|spike|timestamp
7 |Jey |13 |117
8 |Joy |15 |118
9 |Jess|14 |119
我需要处理表中的所有尖峰。
编辑:我不知道表格中的岛屿数量或它们相距多远。
解决方案
如果您不知道岛屿的数量,请使用我的动态方法解决方案。这是演示。
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 |
推荐阅读
- python-3.x - 反转列表时,“类型”对象不可下标
- javascript - 使用模态更新数据后修复日期格式 M d Y
- javascript - 为什么我的 if-else 语句不能使用 OR ( | | )?
- javascript - 用forloop链接promise JS
- python - 2个列表之间的Python差异
- dart - 在 Dart 中将 String 转换为不同运行时类型列表的最佳方法是什么?
- javascript - 无法在反应中的获取响应中访问深层嵌套对象
- php - 如何在 PHP 中打印多值列
- azure - Terraform - 获取存储帐户的主要静态网站端点
- python-3.x - 在 tkinter 中添加具有不同功能的多个按钮