如何检查列数据是否是PostgreSQL中的算术级数

How to check if a column data is an arithematic progression in PostgreSQL

假设我在tableT中有一列C,如下所示:

sr c
1 34444444444440
2 34444444444442
3 34444444444444
4 34444444444446
5 34444444444448
6 34444444444450

如何验证或检查 C 列 中的值是否为等差级数?

step-by-step demo:db<>fiddle

SELECT
    COUNT(*) = 1 as is_arithmetic_progression             -- 4
FROM (
    SELECT
        difference
    FROM (
        SELECT
            *,
            lead(c) OVER (ORDER BY sr) - c as difference  -- 1
        FROM
            mytable
    ) s
    WHERE difference IS NOT NULL                          -- 2
    GROUP BY difference                                   -- 3
) s

等差级数:各元素之差为常数

  1. lead() window function 将下一个值移入当前行。生成与当前值的差值显示差值
  2. lead() 在最后一列中创建一个 NULL 值,因为它没有“下一个”值。所以,这将被过滤
  3. 对差异值进行分组。
  4. 如果您只有一个差异值,那么这将 return 仅在一个组中。只有一个差异值意味着:元素之间存在恒定差异。这正是算术级数的意思。所以如果组数恰好是1,你就有等差级数。

您可以按如下方式使用exists

Select case when count(*) > 0 then 'no progression' else 'progression' end as res_
  From your_table t
 Where exists
      (select 1 from your_table tt
        Where tt.str > t.str
          And tt.c < t.c)

等差级数表示差值都是常数。假设数值是不是浮点数,那么可以直接比较:

select (min(c - prev_c) = max(c - prev_c)) as is_arithmetic_progression
from (select t.*,
             lag(c) over (order by sr) as prev_c
      from t
     ) t

如果这些是浮点值,您可能需要某种容差,例如:

select abs(min(c - prev_c), max(c - prev_c)) < 0.001 as is_arithmetic_progression