Sql 在特定条件下使用重置递增计数的查询

Sql 在特定条件下使用重置递增计数的查询,sql,postgresql,Sql,Postgresql,考虑具有以下架构的表: device_id VARCHAR date DATE visited BOOLEAN 假设表中的数据涵盖了30天的时间段,对于每个设备_id将有30行,一个月的每一天一行(因此,如果我们有10台设备,将有10x30=300行) 我需要编写一个查询,其中结果集将包含一个名为age的额外整数字段,其中age的计算如下:如果访问的为TRUE,则age应设置为0。对于给定设备id的其他行,年龄应连续每一天递增1。所以结果应该是这样的: device_id d

考虑具有以下架构的表:

device_id VARCHAR
date      DATE
visited   BOOLEAN
假设表中的数据涵盖了30天的时间段,对于每个
设备_id
将有30行,一个月的每一天一行(因此,如果我们有10台设备,将有10x30=300行)

我需要编写一个查询,其中结果集将包含一个名为
age
的额外整数字段,其中
age
的计算如下:如果
访问的
TRUE
,则
age
应设置为
0
。对于给定
设备id的其他行
年龄
应连续每一天递增
1
。所以结果应该是这样的:

device_id   date         visited     age
aaaa        2018/05/01    True       0
aaaa        2018/05/02    False      1
aaaa        2018/05/03    False      2
aaaa        2018/05/04    False      3
aaaa        2018/05/05    False      4
aaaa        2018/05/06    True       0
aaaa        2018/05/07    False      1
aaaa        2018/05/08    False      2
aaaa        2018/05/09    False      3
aaaa        2018/05/10    False      4
...
aaaa        2018/05/31    False     15
bbbb        2018/05/01    True       0
...

我一直在尝试使用窗口函数对记录进行排序,但实际上没有一致的分区进行排序。我觉得我错过了一些明显的东西。感谢您的帮助。

您可以使用窗口化的
SUM
在设备id和
计数中准备组
/
行号

WITH cte AS (
  SELECT *, SUM(visited::int) OVER(PARTITION BY device_id ORDER BY date) AS grp
  FROM tab
)
SELECT *, COUNT(*) OVER(PARTITION BY device_id,grp ORDER BY date)-1AS age
FROM cte
ORDER BY device_id, date;