我正在寻找一种解决方案来解决SQL中的一般概念(特别是数据库SQL,但我很乐意为任何类型的SQL解决这个问题).这似乎是教科书上的问题,但我不能简单地绕过它.

想象一下,我有一张这样的桌子

______________________
| time | temperature |
----------------------
|    0 |           2 |
|    1 |           1 |
|    2 |           0 |
|    3 |          -1 |
|    4 |          -2 |
|    5 |          -4 |
|    6 |          -5 |
|    7 |          -3 |
|    8 |          -2 |
|    9 |          -1 |
|   10 |           1 |
|   11 |           1 |
|   12 |          -1 |
|   13 |          -2 |
|   14 |          -1 |
|   15 |           0 |
|   16 |          -2 |
|   17 |          -5 |
|   18 |           1 |
...

现在我想添加一个布尔列flag,它按照以下规则标记所有行:

  1. 温度为<=-5或

  2. 温度为<0,并且在连续负温度的同一簇中存在温度<=-5.

这些规则将产生下表

______________________________
| time | temperature |  flag |
------------------------------
|    0 |           2 | false |
|    1 |           1 | false |
|    2 |           0 | false |
|    3 |          -1 |  true |
|    4 |          -2 |  true |
|    5 |          -4 |  true |
|    6 |          -5 |  true |
|    7 |          -3 |  true |
|    8 |          -2 |  true |
|    9 |          -1 |  true |
|   10 |           1 | false |
|   11 |           1 | false |
|   12 |          -1 | false |
|   13 |          -2 | false |
|   14 |          -1 | false |
|   15 |           0 | false |
|   16 |          -2 |  true |
|   17 |          -5 |  true |
|   18 |           1 | false |
...

我会怎么做呢?

推荐答案

使用了针对SQL Server、MySQL、SQLite的间隔和孤岛查询.

with tbl(ttime, temperature) as (
select  0 ,   2 union all
select  1 ,   1 union all
select  2 ,   0 union all
select  3 ,  -1 union all
select  4 ,  -2 union all
select  5 ,  -4 union all
select  6 ,  -4 union all
select  7 ,  -5 union all
select  8 ,  -3 union all
select  9 ,  -2 union all
select 10 ,  -1 union all
select 11 ,  -1 union all
select 12 ,   1 union all
select 13 ,   1 union all
select 14 ,  -1 union all
select 15 ,  -2 union all
select 16 ,  -1 union all
select 17 ,   0 union all
select 18 ,   1 
)
select ttime, temperature, case when min(temperature) over(partition by grp) <= -5 then 1 else 0 end flag
from (  
   select *, row_number() over(order by ttime) - row_number() over(partition by case when temperature<0 then 1 else 2 end order by ttime) grp 
   from tbl
) t  
order by ttime

db<>fiddle

Sql相关问答推荐

Select /过滤postgr中的树 struct

在SQL中创建一个计数器,根据BigQuery/SQL中的条件递归地添加行值

使用`lag()`获取上一个时间戳

有没有办法在每次计算每一行的数据时更新2个值?

删除事务中的本地临时表

SQL Select 最小优先级

更新其组的日期字段值小于最大日期减go 天数的记录

最近3个月收到的邮箱总数

查找表中特定值的上次更新日期

从包含PostgreSQL中的JSON值的列中提取列表或目录

合并分层表SQL中的第一个非空、变化的空位置

按连续相等值分组排序

SQL 中的第一个值和倒数第二个值

获取多个开始-结束时间戳集之间经过的时间

删除重复记录但保留最新的SQL查询

for each 客户查找每个类别的最新评分

joins 组合多个重复数据删除策略

postgres按组消除分区中的NULLS

在给定列中具有特定值的行与 SQL 中的总行数的比率

从不同的表中 Select 包含单词列表的记录