检查行是否单调增加值

时间:2018-04-30 08:00:09

标签: sql oracle

我正在寻找一种检查方法,如果表中的值对于特定的行子集单调递增。 该表包含列id,name,meas_date和value。对于具有相同名称的所有行,应按meas_date对行进行排序,并且需要检查这些已排序行的值列是否单调递增。 结果,我需要id和一个标志,如果具有id的行打破monotoy,则为1,否则为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。

我认为我需要表格与其自身的某种内部联接,通过rownumber的已排序子集连接,其中每个子集代表name列的一个可能值。在联接表中,我需要计算每行的值列与其前任之间的差异,如果差值为零或更低,则需要得到一个标志= 1。

我正在使用Oracle 11g。

非常感谢,

基督教

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您可以使用分析功能来实现此目的。

这是一个简短的例子:

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

我没有测试它,但我希望它有所帮助。