比较同一张表的不同顺序

我有以下这种情况,一个包含这些列的表格:

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
  • 我需要的:

    恢复第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
    
    链接地址: http://www.djcxy.com/p/89095.html

    上一篇: Compare different orders of the same table

    下一篇: Proper Convention for Injecting D3 into AngualrJS