以下代码并不是完整的答案。它只是比较两个数,一个与下一个。
你需要与下一个值进行比较。假设“日期”列真正是数值型的,而且没有空缺(正如你在问题中所建议的),那么以下内容应该适用于两种数据库:
select t.*,
(case when tnext.value > t.value then 1 else 0 end) as "ascending"
from t left outer join
t tnext
on t."date" = tnext."date" - 1;
如果你想比较3行,需要更多的解释。我无法想到任何定义适用于你的结果。
编辑:
嗯,你似乎想找到升序序列,并标记至少有三行的序列。如果是这样,这就有点难了。以下使用以下技术枚举序列。它识别序列的开始,然后计算每个值的开始数量。
要识别升序序列的开始,请查找值下降的对:
select t.*,
(select 1
from t tprev
where tprev."date" = t."date" - 1 and
tprev.value >= t.value
) as IsAscStart
from t;
为每个序列分配独特的ID:
select t.*
(select count(*)
from t t1 join
t tprev
on tprev."date" = t1."date" - 1 and
tprev.value > t1.value
where t1."date" <= t."date"
) as AscGrouping
from t;
从这个点开始的挑战是获取序列的长度。在SQL Server和MySQL之间,做法差异很大,我想不到一种简单的与数据库无关的方法来实现。
第二次编辑:
在SQL Server中,您可以按以下方式实现所需操作:
with cte as (
select t.*
(select count(*)
from t t1 join
t tprev
on tprev."date" = t1."date" - 1 and
tprev.value > t1.value
where t1."date" <= t."date"
) as AscGrouping
from t
)
select t."date", t.value,
(case when seqlen >= 3 then 1 else 0 end) as "Ascending"
from (select cte.*, count(*) over (partition by AscGrouping) as seqlen
from cte
) t