Как выбрать строку после группы по объединенным таблицам? - PullRequest
0 голосов
/ 05 июля 2019

Мне нужно выбрать самую новую строку из двух таблиц, две таблицы имеют одинаковую схему

Таблица A и таблица B - это одна и та же схема, например:

Таблица A:

user_id, time_stamp, order_id

1,20190101,100

2,20190103,201

3,20190102,300

5,20180209,99

Таблица B:

user_id, time_stamp, order_id

1,20190102,101

2,20190101,200

3,20190103,305

4,20190303,900

Я хочу, чтобы вывод был A union B, затем выберите более новую строку пользователя, упорядочьте по time_stamp:

вывод должен быть:

1,20190102,101

2,20190103,201

3,20190103,305

4,20190303,900

5,20180209,99

Как написать этот SQL?

Ответы [ 4 ]

1 голос
/ 05 июля 2019

Вы можете написать следующий пример запроса demo

with unionedTable as (
select * from tableA
union
select * from tableB)
,newerUsersTable as (
select  distinct on (u.user_id)u.*
from unionedTable u
order by u.user_id, u.time_stamp desc

)select * from newerUsersTable
0 голосов
/ 05 июля 2019

Я бы просто сделал:

select user_id, time_stamp, order_id
from (select ab.*,
             row_number() over (partition by user_id order by time_stamp desc) as seqnum
      from (select a.* from a union all
            select b.* from b
           ) ab
     ) ab
where seqnum = 1;
0 голосов
/ 05 июля 2019

Используйте Группировать по (user_id), чтобы показать все user_id

Использовать max (time_stamp), чтобы получить более новую строку пользователя

SELECT aa.* from (select * from a union SELECT * from b ) aa 
JOIN 
(select user_id,max(time_stamp) as new_time
from (select * from a union SELECT * from b ) u
group by u.user_id) bb
on bb.new_time=aa.time_stamp and bb.user_id=aa.user_id
order by aa.user_id;

SQL Fiddle

0 голосов
/ 05 июля 2019

Основная идея - использовать FULL OUTER JOIN среди двух таблиц, а затем использовать UNION [ALL] для возврата набора данных. Итак, рассмотрим следующий оператор SELECT с предложением WITH:

with a( user_id, time_stamp, order_id ) as
(
 select 1,20190101,100 union all
 select 2,20190103,201 union all    
 select 3,20190102,300 union all    
 select 5,20180209,99  
), b( user_id, time_stamp, order_id ) as
(
 select 1,20190102,101 union all
 select 2,20190101,200 union all    
 select 3,20190103,305 union all    
 select 4,20190303,900 
), c as
(
select a.user_id as user_id_a, a.time_stamp as time_stamp_a, a.order_id as order_id_a,
       b.user_id as user_id_b, b.time_stamp as time_stamp_b, b.order_id as order_id_b
  from a full outer join b
    on a.user_id = b.user_id 
), d as
(
select user_id_a, time_stamp_a, order_id_a  
  from c
 where coalesce(time_stamp_b,time_stamp_a) <= time_stamp_a 
union all 
select user_id_b, time_stamp_b, order_id_b 
  from c
 where time_stamp_b >= coalesce(time_stamp_a,time_stamp_b)
)
select user_id_a as user_id, time_stamp_a as time_stamp, order_id_a as order_id
  from d
 order by user_id_a;

user_id time_stamp  order_id
1       20190102    101
2       20190103    201
3       20190103    305
4       20190303    900
5       20180209    99

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...