首页 > 解决方案 > 检查单调递增值的行

问题描述

我正在寻找一种方法来检查表中的值对于特定的行子集是否单调增加。该表包含列 id、name、meas_date 和 value。对于所有同名的行,这些行应该按 meas_date 排序,并且需要检查这些排序行的 value 列是否单调递增。因此,如果具有 id 的行破坏了 monotoy,我需要 id 和一个标志,否则为 0。示例数据可能是:

id   name   meas_date   value
1    name1  2018/01/01  1
2    name1  2018/01/02  2
3    name2  2018/01/04  2
4    name1  2018/01/03  1
5    name1  2018/01/04  5
6    name2  2018/01/05  4
7    name2  2018/01/06  2
8    name1  2018/01/05  2

期望的结果:

id    flag
1     0
2     0
3     0
4     1
5     0
6     0
7     1
8     1

如果可能,计算结果时无需任何 PL/SQL,只需纯 SQL。

我想我需要某种表与自身的内部连接,通过排序子集的行号连接,其中每个子集代表名称列的一个可能值。在连接表中,我需要计算每一行的值列与其前任之间的差异,如果差异为零或以下,这需要导致 flag=1。

我正在使用 Oracle 11g。

非常感谢,

基督教

标签: sqloracle

解决方案


如果您的 Oracle 版本支持,LAG那么有一个简单的选择:

SELECT
    id,
    CASE WHEN value >= LAG(value, 1, value) OVER (PARTITION BY name ORDER BY meas_date)
         THEN 0 ELSE 1 END AS flag
FROM yourTable

推荐阅读