sql - 如果可用,请在该月加入,否则请在最近一个月加入

标签 sql amazon-redshift

我这里有一个场景

表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/

相关文章:

amazon-web-services - 清除 AWS Redshift 上的缓存

python - Redshift 未通过 Python 脚本连接到主机

postgresql - Redshift - 删除未使用的列

sql - 查询获取最后 n 行(不包括最后一行)

mysql - 查询返回属于组的成员数和不在一条语句中的成员数

PostgreSql + 日期格式YYYY-MM-DD转日、日月年

amazon-web-services - 使用 sha256 密码创建 Redshift 用户

c# - Redshift中的语法错误日志表

sql - 将表与 SQL Server 2005 中存储过程中的表变量进行比较

mysql - 如何对 sql select 语句进行排序,以便正确显示排行榜?