我正在寻找一种检查方法,如果表中的值对于特定的行子集单调递增。 该表包含列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。
非常感谢,
基督教
答案 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
)
我没有测试它,但我希望它有所帮助。