我有以下场景,一个包含这些列的表:
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行的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)
我无法弄清楚如何比较这两个选项,看看哪些用户受此系统错误的影响.
我会用来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
不是无缝的,它也可以工作。