I need to sort out two sets of data. The order rules are followed by first the column "id2" is null or not
.
After sorting out, One set of data should be ordered by the column dt2
when the column id2
is null. The other should be also ordered by the column dt3
when the column id2
is not null.
The tricky part is to combine two sets of data together.
I know ...union all
... but how?
Basic setup
-- create table
create table MyTable
(
id bigint,
id2 bigint null,
dt2 date null,
dt3 date null
)
-- insert value
insert into MyTable (id, id2, dt2, dt3) values
(1, null, '2019-10-01', '2019-11-01'),
(2, null, '2019-09-05', '2019-11-02'),
(3, 1, '2019-10-12', '2019-09-28'),
(4, 2, '2019-10-02', '2019-10-28'),
(5, 3, '2019-09-30', '2019-11-03')
Approach
- divided by two different sets by
row_number()...over()
-
order by
its column union all
- select and
offset...fetch next ... rows only
select id, id2, dt2, dt3 from
(
select id, id2, 1 as idc, dt2, dt3, row_number() over (order by dt3 desc) as rnum
from MyTable
where id2 is null
union all
select id, id2, 2 as idc, dt2, dt3, row_number() over (order by dt2 desc) as rnum
from MyTable
where id2 is not null
) as m
order by m.idc, m.rnum -- order by
offset 0 -- 0 is the skip count
fetch next 2 rows only -- 2 is the page size
idc as a maker to tell whether id2 is null or not.
Thanks for your reading ~
Top comments (0)