根据相应的日期字段

时间:2018-03-16 14:08:43

标签: sql amazon-redshift

我在代表和客户端级别都有指标:

select r.rep_month, c.client_month, 
count(distinct r.id) reps, count(distinct c.id) clients
from clients c
left join reps r on c.rep_id=r.id

这当然不起作用,因为它给出了rep_month / client_month-的所有组合,并且从时间序列的角度来看 - 它们应该基于两个不同的日期来计算。

我需要的是基于rep_month计算代表和基于client_month计算的客户端,所以输出中应该只有一个日期。

一个通用的例子是这样的:

rep_date     client_date    reps    clients
3/1/18 0:00  8/1/17 0:00    14      24
3/1/18 0:00  2/1/17 0:00    4       6
3/1/18 0:00  12/1/17 0:00   9       12
3/1/18 0:00  1/1/18 0:00    14      16
3/1/18 0:00  10/1/17 0:00   11      11
3/1/18 0:00  12/1/16 0:00   4       7
3/1/18 0:00  1/1/17 0:00    1       1
3/1/18 0:00  4/1/17 0:00    4       4
3/1/18 0:00  3/1/17 0:00    12      14
3/1/18 0:00  11/1/17 0:00   5       7
3/1/18 0:00  5/1/17 0:00    4       5
3/1/18 0:00  11/1/16 0:00   1       1
3/1/18 0:00  2/1/18 0:00    5       5
3/1/18 0:00  8/1/16 0:00    2       2
3/1/18 0:00  9/1/17 0:00    16      20
3/1/18 0:00  (null)         49      0

这将是预期的输出:

date    reps    clients
3/1/18  49      135

但请注意,可能存在rep_date和client_date不为空的情况,因此将两者合并为:coalesce(client_date,rep_date)无法正常工作。

谢谢!

2 个答案:

答案 0 :(得分:1)

我想你想要这样的东西:

select mon, sum(reps) as reps, sum(clients) as clients 
from ((select c.client_month as mon, count(*) as clients, 0 as reps
       from clients c
       group by c.client_month
      ) union all
      (select r.rep_month, 0 as clients, count(*) as reps
       from reps r
       group by r.rep_month
      ) 
     ) rc
group by mon
order by mon;

注意:

  • 您也可以使用join执行此操作,但是您必须处理两个表中缺少的时间段(即,您需要full outer join和许多coalesce())。
  • 我假设id在每个表中都是唯一的,因此count(*)count(distinct id)执行相同的操作。前者更有效,因为删除重复项不会产生开销。

答案 1 :(得分:0)

您可以尝试:

   Select r.rep_month, c.client, r.reps from
     (select rep_month, count(distinct id) reps 
         from reps
         group by rep_month) r 
   left join  
     (select client_month, count(distinct id) clients 
         from clients 
         group by client_month) c
   on r.rep_month = c.client_month

你可以加入id,只是加入月份是没有意义的。或者,如果有一个包含id的主表,请先从该表开始。此外,客户表必须包含所有月份。如果每个月都有代表,请先将该表放入,然后再离开。