比较同一张表的不同顺序
我有以下这种情况,一个包含这些列的表格:
table_id|user_id|os_number|inclusion_date
在系统中,os_number对用户是顺序的,但由于系统错误,一些用户以错误的顺序插入操作系统。 像这样的东西:
table_id | user_id | os_number | inclusion_date
-----------------------------------------------
1        | 1       | 1         | 2015-11-01
2        | 1       | 2         | 2015-11-02
3        | 1       | 3         | 2015-11-01
我需要的:
恢复第2行和第3行的table_id,这是无序的。
我有这两个选择,以两种不同的顺序向我显示table_id:
select table_id from table order by user_id, os_number
select table_id from table order by user_id, inclusion_date
我找不出如何比较这两个选择并查看哪些用户受此系统错误影响。
  你的问题有点困难,因为没有正确的顺序(如前所述) - 因为日期可能有联系。  因此,使用rank()或dense_rank()函数比较两个值并返回不正确顺序的值: 
select t.*
from (select t.*,
             rank() over (partition by user_id order by inclusion_date) as seqnum_d,
             rank() over (partition by user_id order by os_number) as seqnum_o
      from t
     ) t
where seqnum_d <> seqnum_o;
对两个订单使用row_number() : 
select *
from (
    select *, 
        row_number() over (order by os_number) rnn,
        row_number() over (order by inclusion_date) rnd
    from a_table
    ) s
where rnn <> rnd;
 table_id | user_id | os_number | inclusion_date | rnn | rnd 
----------+---------+-----------+----------------+-----+-----
        3 |       1 |         3 | 2015-11-01     |   3 |   2
        2 |       1 |         2 | 2015-11-02     |   2 |   3
(2 rows)
不完全确定这方面的表现,但是您可以在同一个表上使用交叉应用,以便在一个查询中获得结果。 这会调出不正确的table_id对。
select 
    a.table_id as InsertedAfterTableId,
    c.table_id as InsertedBeforeTableId
from table a
cross apply 
(
    select b.table_id
    from table b
    where b.inclusion_date < a.inclusion_date and b.os_number > a.os_number
) c
