Выберите Верхнюю строку 2-й таблицы в SQL Join - PullRequest
1 голос
/ 30 января 2012

У меня есть таблицы с именами USERS и COMM_HISTORY

USERS(user_id, name)
COMM_HISTORY(comm_history_id, comm_date, comm_by, user_id)

USERS Таблица будет иметь уникальный список пользователей, а COMM_HISTORY может иметь дубликаты user_id.Когда я присоединяюсь к ним, я хотел бы получить имя пользователя и самое последнее comm_date из COMM_HISTORY.

Что-то похожее с этим сообщением sql join - выбрать только верхнюю строку из 2-й таблицы но, похоже, в этом посте нет правильных ответов.

Я бы хотел получить результат ff, когда присоединяюсь к ним

1 John Doe 2012-01-29 Jane Doe

вместо

1 John Doe 2011-10-20 Jane Lee
2 John Doe 2012-01-29 Jane Doe
3 John Doe 2011-09-08 Jane Doe

У кого-нибудь есть решение для этого?

Ответы [ 2 ]

0 голосов
/ 30 января 2012

подход с использованием cte

with recent_comms as (
select 
   row_number() over (partition by user_id, order by comm_date decs) as rn,
   comm_date,
   comm_by, 
   user_id 
FROM comm_history)

select 
   users.name, 
   recent_comms.comm_date, 
   recent_comms.comm_by
from users
join recent_comms on users.user_id = recent_comms.user_id
and recent_comms.rn = 1

изменение rn = 1 на rn <= 5 приведет к получению последних 5 на пользователя, например. </p>

0 голосов
/ 30 января 2012

@ Решение Andomar в другом вопросе должно работать.Адаптированный к вашему варианту использования, это будет:

SELECT USERS.*, COMM_HISTORY.*
FROM USERS
INNER JOIN COMM_HISTORY
  ON USERS.user_id = COMM_HISTORY.user_id 
LEFT JOIN COMM_HISTORY LATER_HISTORY
  ON COMM_HISTORY.user_id = LATER_HISTORY.user_id 
  AND LATER_HISTORY.comm_date > COMM_HISTORY.comm_date
WHERE LATER_HISTORY.user_id IS NULL

Присоедините таблицу истории обратно к себе и установите условие, согласно которому не следует выбирать более поздние строки истории.

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