У меня есть сценарий здесь
Таблица A:
---------------------------------------------
Req CreatedMth Amount By
---------------------------------------------
R1 201806 100 John
R2 201805 200 Mary
Таблица B:
-----------------------------------------------------
User AvailableinOrgMonth Position
-----------------------------------------------------
John 201805 P1
John 201806 P1
John 201807 P1
John 201808 P1
Mary 201803 P1
Mary 201804 P1
Ожидаемые результаты:
-----------------------------------------------------------------------------
Req CreatedMth Amount By AvailableinOrgMonth Position
-----------------------------------------------------------------------------
R1 201806 100 John 201806 P1
R2 201805 200 Mary 201804 P1
Логика здесь в том, что если пользователь доступен в таблице B для этого месяца, присоединитесь к нему и к пользователю. Еще найдите последний месяц, в который пользователь доступен, и присоединяйтесь к нему.
Теперь вы можете сказать, если Мэри не доступна в 201805 году, как она может создать запрос. Проблема в таблице B - это каждый день, когда данные за текущий месяц заменяются, и данные за последний день месяца сохраняются. Таким образом, Мэри, возможно, создала запрос на 2018-05-02, но уехала на 2018-05-31, чтобы ежемесячные данные не появлялись в 201806 году.
Я написал ниже запрос
SELECT
A.Req,
A.CreatedMth,
A.Amount,
A.By,
A.AvailableinOrgMonth,
A.Position
FROM
Table A as A
LEFT JOIN (
Select
*,
MAX(AvailableinOrgMonth) OVER (PARTITION BY user) as Maxmonth
FROM
Table B
) B ON A.By = B.User
AND (
A.CreatedMth = B.AvailableinOrgMonth
OR (
A.CreatedMth != B.AvailableinOrgMonth
AND B.AvailableinOrgMonth = B.Maxmonth
)
)
Это возвращает
Req CreatedMth Amount By AvailableinOrgMonth Position
--------------------------------------------------------------------------------
R1 201806 100 John 201806 P1
R1 201806 100 John 201808 P1(dup)
R2 201805 100 Mary 201804 P1
Как получить правильный результат.
Благодаря.