当前方法的问题在于,每个客户的每次租赁都将被分开处理。我假设客户可能会多次租用,因此我们需要汇总客户的所有租赁数据来计算类别。
因此,要创建主表,您在逻辑中提到周末客是“他们的大部分租金来自周六和周日”的客户,而常客是每周至少租一次的客户。
2 个问题:-
- 对于周末游客来说,“最多”的逻辑是什么?
- 这两个类别是否相互排斥?从声明看来并非如此,因为客户可能只在周六或周日租房。
我在 Oracle SQL 方言中尝试了一个解决方案(工作但性能可以提高),其逻辑如下:如果客户在工作日租用的租金比周末多,则客户是普通客户,否则是周末客户。可以根据上述问题的答案修改此查询。
select
c.customer_id,
c.first_name || ' ' || c.last_name as Customer_Name,
case
when r.reg_count>r.we_count then 'Regulars'
else 'Weekenders'
end as Customer_Category
from customer c
inner join
(select customer_id, count(case when trim(to_char(rental_date, 'DAY')) in ('MONDAY','TUESDAY','WEDNESDAY','THURSDAY','FRIDAY') then 1 end) as reg_count,
count(case when trim(to_char(rental_date, 'DAY')) in ('SATURDAY','SUNDAY') then 1 end) as we_count
from rental group by customer_id) r on r.customer_id=c.customer_id;
根据评论中给出的清晰度更新了查询:-
select
c.customer_id,
c.first_name || ' ' || c.last_name as Customer_Name,
case when rg.cnt>0 then 1 else 0 end as REGULAR,
case when we.cnt>0 then 1 else 0 end as WEEKENDER
from customer c
left outer join
(select customer_id, count(rental_id) cnt from rental where trim(to_char(rental_date, 'DAY')) in ('MONDAY','TUESDAY','WEDNESDAY','THURSDAY','FRIDAY') group by customer_id) rg on rg.customer_id=c.customer_id
left outer join
(select customer_id, count(rental_id) cnt from rental where trim(to_char(rental_date, 'DAY')) in ('SATURDAY','SUNDAY') group by customer_id) we on we.customer_id=c.customer_id;
测试数据:
insert into customer values (1, 'nonsensical', 'coder');
insert into rental values(1, 1, sysdate, 1, sysdate, 500);
insert into customer values (2, 'foo', 'bar');
insert into rental values(2, 2, sysdate-5, 2, sysdate-5, 800); [Current day is Friday]
查询输出(第一次查询):
CUSTOMER_ID CUSTOMER_NAME CUSTOMER_CATEGORY
1 nonsensical coder Regulars
2 foo bar Weekenders
查询输出(第二次查询):
CUSTOMER_ID CUSTOMER_NAME REGULAR WEEKENDER
1 nonsensical coder 0 1
2 foo bar 1 0