比较同一个表的不同订单

Wel*_*lli 7 sql postgresql

我有以下场景,一个包含这些列的表:

table_id|user_id|os_number|inclusion_date
Run Code Online (Sandbox Code Playgroud)

在系统中,os_number对于用户是顺序的,但是由于系统错误,一些用户以错误的顺序插入OS.像这样的东西:

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
Run Code Online (Sandbox Code Playgroud)
  • 注意在编号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
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何比较这两个选项,看看哪些用户受此系统错误的影响.

Gab*_*ger 0

我会用来WINDOW FUNCTIONS获取有问题的订单中的行号,然后比较它们:

SELECT
    sub.table_id,
    sub.user_id,
    sub.os_number,
    sub.inclusion_date,
    number_order_1, number_order_2
FROM (
    SELECT
        table_id,
        user_id,
        os_number,
        inclusion_date,
        row_number() OVER (PARTITION BY user_id
                           ORDER BY os_number
                                    ROWS BETWEEN UNBOUNDED PRECEDING
                                    AND UNBOUNDED FOLLOWING
        ) AS number_order_1,

        row_number() OVER (PARTITION BY user_id
                           ORDER BY inclusion_date
                                    ROWS BETWEEN UNBOUNDED PRECEDING
                                    AND UNBOUNDED FOLLOWING
        ) AS number_order_2
    FROM
        table
) sub    
WHERE
    number_order_1 <> number_order_1
; 
Run Code Online (Sandbox Code Playgroud)

编辑:

因为a_horse_with_no_name对我的最终答案提出了很好的观点。我回到了我的第一个答案(查看编辑历史记录),如果os_number不是无缝的,它也可以工作。