我有一个表:
1 180101 180228
2 180301 180831
3 180901 999999
4 180801 999999
5 180401 181031
6 181101 999999
7 180101 999999
列为:userid、开始日期、结束日期。
日期为文本格式,YYYMDD和999999表示没有结束日期。
如何获得每个月的客户数量?例如,3月将包括3月或之前开始,3月或之后结束的所有客户。但不包括从1月份开始,到2月份结束的客户。
我试着这样做,然后写出所有的逻辑:
SELECT SUBSTRING(start_date, 3, 2) AS start, SUBSTRING(end_date, 3, 2) AS end, count(*)
FROM data
GROUP BY start, end
ORDER BY start
我只是想知道是否有更好的方法?
如果你每个月都有开始,你可以使用相关的子查询来获得该月第一天的计数:
select ym.yymm,
(select count(*)
from t
where t.startdate <= ym.yymm and
t.enddate >= ym.yymm
) as month_count
from (select distinct left(startdate, 4) as yymm
from t
) ym;
某些数据库可能将left()
拼写为substr()
。