我有以下场景,一个包含这些列的表:
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;
关于sql - 比较同一张表的不同订单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33998238/