2017-07-19 35 views
0

这里是我的数据排序按日期倒序并找到ID其不在降

ID VER_ID DUE_DATE 
1478 1.0 28-MAR-16 
1352 1.0 8-MAY-17 
1479 2.0 28-MAR-17 
1481 2.0 9-June-17 

我需要找出所有rows-标识它们不按递减顺序,当我排序DUE_DATE递减和由ver_id分组。

用我的上述数据 预期结果:(因为版本2.0具有日期排列的ID - 降序)

ID VER_ID DUE_DATE 
1478 1.0 28-MAR-16 
1352 1.0 8-MAY-17 
+0

为什么你认为你需要的?如果'ID'是主键,那么它的值或“排序”性质是完全不相关的 –

回答

2

嗯。 “不按降序排列”的定义是,该值要么大于前一个值,要么小于下一个值。

有了这个定义:

select t.* 
from (select t.*, 
      lag(due_date) over (order by id) as prev_due_date, 
      lead(due_date) over (order by id) as next_due_date, 
     from t 
    ) t 
where prev_due_date < due_date or next_due_date > due_date; 
+0

我们应该通过VER_ID在此查询中的某处添加组?因为不匹配应该在ver_id中找到而不是整个表。 – Pat

+0

@Pat。 。 。如果你只是想在每个'ver_id'的“内”,那么在''order''之前加'partition by ver_id'。 –

+0

感谢它的工作。 – Pat

2

您可以通过使用“滞后”分析功能找到它。 它会为您提供前一行的“ID”列值,您可以将其与当前行的“ID”列进行比较。

例如 - 在下面的emp表中,记录按“hiredate”desc排序,case语句检查的是比先前员工的“empno”小的“empno”。因此,对于表中第一列“FLAG”,如果EMPNO不下降,则给出“0”,否则为“1”。

SELECT (CASE 
      WHEN empno > lag (empno) OVER (ORDER BY hiredate desc) THEN 0 
      ELSE 1 
     END) as flag, a.* 
    FROM emp a 
ORDER BY hiredate DESC; 

表:EMP

FLAG | EMPNO  | ENAME  | JOB   | MGR   | HIREDATE  | SAL   | COMM | DEPTNO 
--------+---------------+---------------+---------------+---------------+-------------------+---------------+-----------+--------- 
1  | 7876  | ADAMS  | CLERK  | 7788  | 12-Jan-83  | 1100  |   | 20 
1  | 7788  | SCOTT  | ANALYST  | 7566  | 9-Dec-82  | 3000  |   | 20 
0  | 7934  | MILLER  | CLERK  | 7782  | 23-Jan-82  | 1300  |   | 10 
1  | 7902  | FORD  | ANALYST  | 7566  | 3-Dec-81  | 3000  |   | 20 
1  | 7900  | JAMES  | CLERK  | 7698  | 3-Dec-81  | 950   |   | 30 
1  | 7839  | KING  | PRESIDENT |    | 17-Nov-81  | 5000  |   | 10 
1  | 7654  | MARTIN  | SALESMAN | 7698  | 28-Sep-81  | 1250  | 1400 | 30 
0  | 7844  | TURNER  | SALESMAN | 7698  | 8-Sep-81  | 1500  | 0  | 30 
1  | 7782  | CLARK  | MANAGER  | 7839  | 9-Jun-81  | 2450  |   | 10 
1  | 7698  | BLAKE  | MANAGER  | 7839  | 1-May-81  | 2850  |   | 30 
1  | 7566  | JONES  | MANAGER  | 7839  | 2-Apr-81  | 2975  |   | 20 
1  | 7521  | WARD  | SALESMAN | 7698  | 22-Feb-81  | 1250  | 500  | 30 
1  | 7499  | ALLEN  | SALESMAN | 7698  | 20-Feb-81  | 1600  | 300  | 30 
1  | 7369  | SMITH  | CLERK  | 7902  | 17-Dec-80  | 800   |   | 20