如何检查列是否在PostgreSQL中具有所有递增的值

时间:2018-12-15 20:13:58

标签: sql postgresql

理想情况下,我如何才能通过1个表扫描来确定一列是否具有所有递增的值。即:1、2、5、6、8、10、12,...

是否需要自定义功能?

2 个答案:

答案 0 :(得分:0)

您可以使用lag()lead()进行汇总:

select (case when bool_and(col > prev_col) then 'increasing'
             else 'not increasing'
         end)
from (select t.*, lag(col) over (order by ?) as prev_col
      from t
     ) t
where prev_col is not null;

请注意,?是用于表中指定行顺序的列。 SQL表表示无序集,因此需要这样的列才能使您的问题有意义。

答案 1 :(得分:0)

我建议在子查询中将EXISTS表达式与窗口函数(lead()lag())结合使用。 EXISTS将在找到第一行后立即停止扫描,使用大表可以更快地

SELECT EXISTS (
   SELECT FROM (SELECT col, lead(col) OVER (ORDER BY id) AS next_col FROM tbl) t
   WHERE  col >= next_col
   OR     col IS NULL
  );

id是确定行顺序的列。

如果您的条件得到满足(“列的所有值都在增加” ),它将返回FALSE

虽然未定义列NOT NULL,但还要排除NULL总是会违反您条件的值。