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;