理想情况下,我如何才能通过1个表扫描来确定一列是否具有所有递增的值。即:1、2、5、6、8、10、12,...
是否需要自定义功能?
答案 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
总是会违反您条件的值。