sql - 有没有好的方法可以找到与postgresql的另一行之间的差异总和超过阈值的行
问题描述
我正在尝试使用postgresql找到另一行之间的差异总和超过阈值的行。
例如使用下面的脚本,我可以创建测试表。
/*prepare for test table*/
with recursive target_table(time,target,value,flg) as(
select
1
, random()
, random()
, false
union all
select
time+1
, random()
, random()
, case when time=9 then true else false end
from target_table
where time < 20
)
select *,sum(value) over (order by time) as sum_of_value from target_table;
下表是示例表。
1 0.5955741602068017 0.062468466592012106 false 0.062468466592012106
2 0.9599096994358831 0.2721417844426348 false 0.3346102510346469
3 0.5219622680617206 0.47568365271884616 false 0.8102939037534931
4 0.19330178068888415 0.055219926055169566 false 0.8655138298086626
5 0.7849454445680166 0.869388793530252 false 1.7349026233389147
6 0.3818554639492504 0.6618063662299782 false 2.396708989568893
7 0.14781479428049948 0.2939156384156725 false 2.6906246279845654
8 0.35489557675010985 0.3223190750002196 false 3.012943702984785
9 0.7468542842938106 0.4682370283799777 false 3.4811807313647627
10 0.9827402637131684 0.8947818572002681 false 4.375962588565031
11 0.9795760087001852 0.7735269168553209 false 5.149489505420352
12 0.7201651414850829 0.9190766910614023 false 6.068566196481754
13 0.4675524690241204 0.5993146022105726 false 6.667880798692327
14 0.7946650321278526 0.3035202408540094 false 6.971401039546336
15 0.9985454346140514 0.5523127942270101 true 7.523713833773346
16 0.5638512819364934 0.5059578895998662 false 8.029671723373212
17 0.3087199667465299 0.7731866673265166 false 8.802858390699729
18 0.5435603740732802 0.34633746722375847 false 9.149195857923488
19 0.9042064638800369 0.8654612596373745 false 10.014657117560862
20 0.6421889049801024 0.6367246358906549 false 10.651381753451517
我想找到一个最接近的行,该行在标志为真的第 15 行之间的差异总和超过阈值。
这次如果阈值为 5,我想找到第 15 行的差值总和超过 5 的行。那是第 6 行。因为 7.523713833773346-2.396708989568893=5.1270048442 超过 5 并且距离第 15 位最近。
当然,实际上表中的数据量很大。如何找到适合标志为 true 的行的每一行?
解决方案
这是你想要的?
select max(t.id)
from mytable t
inner join mytable t15
on t15.id = 15
and t15.sum_of_value - t.sum_of_value > 5
这将为您提供其值与 id 为 15 的记录值相差大于 5 的最大记录 ID。
如果你想要整个记录,那么:
select t.*
from mytable t
inner join mytable t15
on t15.id = 15
and t15.sum_of_value - t.sum_of_value > 5
order by t1.id desc
limit 1
推荐阅读
- angular - 在角度应用程序中安装 highcharts 时出错
- autodesk-forge - 获取清单时收到 504 Gateway Time-out
- mysql - MySQL 表查询
- swift - WKExtendedRuntimeSession 命中内部错误:“无法在预定会话上调用 startSession”
- ios - iOS:从 UISplitViewController 推送新的 ViewController
- google-calendar-api - Google 服务帐户:委托域范围的授权以仅模拟一个用户
- java - 如何停止上一个正在收听 kafka-topic 的线程
- angular - Http GET,角度
- go - 安装base64的问题
- html - jQuery将JSON项目值写入每个带有id的td