比较同一张表的不同顺序
我有以下这种情况,一个包含这些列的表格:
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
链接地址: http://www.djcxy.com/p/89095.html