Присоединяйтесь на месяц, если доступно, присоединяйтесь на последний месяц - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть сценарий здесь

Таблица 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  

Как получить правильный результат. Благодаря.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Требуется требование, действительное на дату или ранее. Позвольте мне предположить, что B имеет уникальный идентификатор для каждой строки. Затем вы можете получить соответствующую строку, используя коррелированный подзапрос:

select a.*,
       (select b.b_id
        from b
        where b.user = a.by and b.AvailableinOrgMonth <= a.CreatedMth 
        limit 1
       ) as b_id
from a;

Тогда вы можете получить дополнительную информацию с другим join:

select a.*, b.*
from (select a.*,
             (select b.b_id
              from b
              where b.user = a.by and b.AvailableinOrgMonth <= a.CreatedMth 
              limit 1
             ) as b_id
      from a
     ) a left join
     b
     on a.b_id = b.b_id;
0 голосов
/ 02 ноября 2018

Я думаю, что вы ищете

SELECT T1.*,
       CASE WHEN EXISTS(
                        SELECT 1
                        FROM T2
                        WHERE T1.[By] = T2.[User]
                              AND
                              T1.CreatedMth = T2.AvailableinOrgMonth
                       )
           THEN T1.CreatedMth
           ELSE MAX(T2.AvailableinOrgMonth) 
           END AvailableinOrgMonth,
       T2.Position
FROM T1 INNER JOIN T2 ON T1.[By] = T2.[User]
GROUP BY
         T1.Req,
         T1.CreatedMth,
         T1.Amount,
         T1.[By],
         T2.Position;

Возвращает:

+-----+------------+--------+------+---------------------+----------+
| Req | CreatedMth | Amount |  By  | AvailableinOrgMonth | Position |
+-----+------------+--------+------+---------------------+----------+
| R1  |     201806 |    100 | John |              201806 | P1       |
| R2  |     201805 |    200 | Mary |              201804 | P1       |
+-----+------------+--------+------+---------------------+----------+

Однако, я не знаю, откуда вы взяли 100 Сумма для обеих строк

...