postgresql 查找行中的最小值

4nkexdtk  于 2023-02-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(310)

我有一个表,例如:

|    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
任何解决方案都是帮助谢谢!

insrf1ej

insrf1ej1#

一个选项是使用运行总和,每当数字的值跳跃100+时,运行总和增加1:

with t as
  (
  select *,
    case when numbers - lag(numbers, 1, numbers) over (order by id) >= 100 then 1 else 0 end as grp
  from table_name
  )
select id, numbers from t
order by sum(grp) over (order by id) desc, numbers
limit 1

see demo

dzhpxtsq

dzhpxtsq2#

step-by-step demo:db<>fiddle

SELECT DISTINCT ON (group_id)                            -- 6
    *
FROM (
    SELECT
        *,
        SUM(change) OVER (ORDER BY id) as group_id       -- 5
    FROM (
        SELECT
            *,
            COALESCE(                                    -- 3
                numbers 
                    - lag(numbers) OVER (ORDER BY id)    -- 1
                    >= 100,                              -- 2 
                true
            )::int as change                             -- 4
        FROM mytable
    ) s
) s
ORDER BY group_id, numbers

1.使用lag() window function将上一个numbers值移动到当前记录
1.计算当前和先前numbers值之间的差值,并检查是否为>= 100
1.因为第一条记录没有以前的numbers值,所以差异计算将产生NULL值。要避免这种情况,请使用COALESCE将所有NULL值设置为true(这表示计算组的更改,如100跳转)
1.将布尔值转换为int(true == 1false == 0
1.现在所有numbers跳转〉= 100(和第一条记录)具有1标记,表示组的第一条记录。使用有序窗口函数累积SUM以创建组ID(每个1记录增加ID,而每个0记录获得与前一记录相同的ID,这意味着,它是同一组,意味着没有100跳)
1.使用DISTINCT ON (group_id)可以仅获取每个有序组的一条记录。组必须按数字排序,以便最小数字成为每组的第一条记录,由DISTINCT ON获取。

**注意:**如果numbers值严格递增,您可以在步骤3处停止,并简单地使用WHERE change == true来获取跳转记录,因为它们自动成为每组中具有最小值的记录。

相关问题