Как запросить последнюю вставленную строку для каждой группы в Oracle 10 - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть две таблицы о пользователях, где я хочу объединить две таблицы и показать последние замечания каждого пользователя

ниже таблица

enter image description here

Я хочу запросить последние замечания для каждого пользователя (1 замечание на пользователя)

нижеприведенный запрос, который я написал, но возвращает несколько замечаний для пользователя, если дата и время совпадают для замечаний

SELECT a.cust_id,b.remarks,b.contact_date,b.contact_time FROM customers a,(select * from customer_review
where (cust_id,contact_time,contact_date) in (select cust_id, max(contact_time),max(contact_date) from customer_review group by cust_id)
) b WHERE  a.cust_id=b.cust_id;

enter image description here

Пожалуйста, дайте какое-либо решение для запроса 1 реплики на пользователя (Примечание: извините, я не могу изменить детали столбца, если таковые имеются) Прямая ссылка Oracle Live

Ответы [ 3 ]

0 голосов
/ 04 ноября 2019

В одном методе используется row_number():

select cr.*
from (select cr.*,
             row_number() over (partition by cust_id order by contact_date desc, contact_time desc) as seqnum
      from customer_review cr
     ) cr
where seqnum = 1;

. Для получения результатов выборки вам не нужна таблица customer, если только вы не хотите, чтобы клиенты не оставляли отзывов.

0 голосов
/ 04 ноября 2019

Вы можете попробовать ниже запрос:

   Select * from 
    (SELECT a.cust_id,b.remarks,b.contact_date,b.contact_time FROM customers a,(select * from customer_review
        where (cust_id,contact_time,contact_date) in 
    (select cust_id, max(contact_time),max(contact_date) from customer_review group by cust_id order by max(contact_time) desc,max(contact_date) desc)
        ) b WHERE  a.cust_id=b.cust_id) WHERE ROWNUM = 1;
0 голосов
/ 04 ноября 2019

Вы можете присоединиться и использовать коррелированный подзапрос для фильтрации:

select 
    c.cust_id,
    c.cust_name,
    r.remarks,
    r.contact_time
from customers c
inner join customer_review r 
    on  r.cust_id = c.cust_id
    and r.contact_time = (
        select max(contact_time)
        from customer_review r1
        where r1.cust_id = r.cust_id
    )

При индексе customer_review(cust_id, contact_time) это должно быть очень эффективным вариантом.

Если вы этого не сделаетенужна информация из таблицы customers (например, имя клиента), тогда нет необходимости join:

select r.*
from customer_review r 
where contact_time = (
    select max(contact_time)
    from customer_review r1
    where r1.cust_id = r.cust_id
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...