我这里有一个场景
表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 中可用,则加入该用户。否则找到用户可用的最新月份并加入。 现在您可能会说,如果 Mary 在 201805 年没有空,她如何创建请求。表 B 中的问题是每天都会替换当月的数据并保留该月的最后一天的数据。因此,玛丽可能在 2018 年 5 月 2 日创建了请求,但在 2018 年 5 月 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
如何获得正确的结果。 谢谢。
最佳答案
您需要在该日期或之前有效的请求。让我假设 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;
然后您可以通过另一个加入
获取更多信息:
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;
关于sql - 如果可用,请在该月加入,否则请在最近一个月加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53123749/