如何检查列数据是否是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 列 中的值是否为等差级数?
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
等差级数:各元素之差为常数
lead()
window function 将下一个值移入当前行。生成与当前值的差值显示差值
lead()
在最后一列中创建一个 NULL
值,因为它没有“下一个”值。所以,这将被过滤
- 对差异值进行分组。
- 如果您只有一个差异值,那么这将 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
假设我在tableT中有一列C,如下所示:
sr | c |
---|---|
1 | 34444444444440 |
2 | 34444444444442 |
3 | 34444444444444 |
4 | 34444444444446 |
5 | 34444444444448 |
6 | 34444444444450 |
如何验证或检查 C 列 中的值是否为等差级数?
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
等差级数:各元素之差为常数
lead()
window function 将下一个值移入当前行。生成与当前值的差值显示差值lead()
在最后一列中创建一个NULL
值,因为它没有“下一个”值。所以,这将被过滤- 对差异值进行分组。
- 如果您只有一个差异值,那么这将 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