我有一个表,例如:
| ID | numbers |
| -------- | -------- |
| 1 | 200 |
| 2 | 210 |
| 3 | 320 |
| 4 | 340 |
| 5 | 360 |
| 6 | 480 |
| 7 | 490 |
| 8 | 500 |
| 9 | 610 |
| 10 | 630 |
| 11 | 700 |
在数字变化超过100的任何地方(ID 3,(ID 1上的最小值200和ID 3上的320大于100),因此重新开始最小值搜索)需要在跳转后找到最小值。
在ID 3上跳跃一次之后第一个最小值ID 1,然后重新开始搜索最小值,并且当前最小值是ID 3上的320,在再次重新开始搜索之后,在ID 6上跳跃一次,并且重新开始最小值搜索,最小值是ID 6上的480,然后在ID 9上再次跳跃,因此重新开始最小值搜索,并且当前最小值是ID 9上的630。
一般最小搜索不取最大数刚过,我不能在代码中设置固定数(如身份证号),因为以后会改变。我查询了一下,发现超过100跳是什么,然后重新开始最小搜索。
select pos.min(numbers) as minimumtemp from example_table;
这种情况下的预期输出最小值= 610
任何解决方案都是帮助谢谢!
2条答案
按热度按时间insrf1ej1#
一个选项是使用运行总和,每当数字的值跳跃100+时,运行总和增加1:
see demo
dzhpxtsq2#
step-by-step demo:db<>fiddle
1.使用
lag()
window function将上一个numbers
值移动到当前记录1.计算当前和先前
numbers
值之间的差值,并检查是否为>= 100
1.因为第一条记录没有以前的
numbers
值,所以差异计算将产生NULL
值。要避免这种情况,请使用COALESCE
将所有NULL
值设置为true(这表示计算组的更改,如100跳转)1.将布尔值转换为int(
true == 1
,false == 0
)1.现在所有
numbers
跳转〉= 100(和第一条记录)具有1
标记,表示组的第一条记录。使用有序窗口函数累积SUM
以创建组ID(每个1
记录增加ID,而每个0
记录获得与前一记录相同的ID,这意味着,它是同一组,意味着没有100跳)1.使用
DISTINCT ON (group_id)
可以仅获取每个有序组的一条记录。组必须按数字排序,以便最小数字成为每组的第一条记录,由DISTINCT ON
获取。**注意:**如果
numbers
值严格递增,您可以在步骤3处停止,并简单地使用WHERE change == true
来获取跳转记录,因为它们自动成为每组中具有最小值的记录。