我需要获取每个月的用户ID数量,但是仅当用户的最小月份在该月之内时,才应计入该月的用户ID。
因此,如果客户A的分钟(天)为04/18,那么月份和年份将被计算在内。
我的桌子看起来像:
monthyear | id
02/18 A32
04/19 T39
05/19 T39
04/19 Y95
01/18 A32
12/19 I99
11/18 OPT
09/19 TT8
我正在做类似的事情:
SELECT day, id
SUM(CASE WHEN month = min(day) THEN 1 ELSE 0)
FROM testtable
GROUP BY 1
但是我不确定如何为每个用户ID进行指定,因此当用户的min(Day)= day时,只有用户ID = 1
目标表为:
monthyear | count
01/18 1
02/18 0
11/18 1
04/19 2
05/19 0
09/19 1
12/19 1
答案 0 :(得分:1)
使用窗口功能。让我假设您的monthyear
确实是yearmonth
,因此可以正确排序:
SELECT yearmonth, COUNT(*) as numstarts
FROM (SELECT tt.*, ROW_NUMBER() OVER (PARTITION BY id ORDER BY yearmonth) as seqnum
FROM testtable tt
) tt
WHERE seqnum = 1
GROUP BY yearmonth;
如果您确实有月-年的荒谬格式,则可以使用字符串操作。这些取决于数据库,但是类似这样:
SELECT yearmonth, COUNT(*) as numstarts
FROM (SELECT tt.*,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY RIGHT(monthyear, 2), LEFT(monthyear, 2) as seqnum
FROM testtable tt
) tt
WHERE seqnum = 1
GROUP BY yearmonth;
答案 1 :(得分:0)
我假设您有一列是日期(必须使用min())。您可以通过为每个ID选择一个minimal date
(子查询t2
)然后仅对通过left join
连接的这些行进行计数来完成此操作,因此,如果没有连接,您将获得零。日期或数据中的monthyear
。
select
monthyear
,count(t2.id) as cnt
from testtable t1
left join (
select
min(date) as date
,id
from testtable
group by id
) t2
on t2.date = t1.date
and t2.id = t1.id
group by monthyear
答案 2 :(得分:0)
您正在寻找每月的新用户数量,是吗?
这是一种方法。 请注意,我必须使用TO_DATE和TO_CHAR来确保月/年文本字符串正确排序。如果您使用真实的DATE列,则不必要。
另一个复杂性是添加空月份(新用户为零的月份)。最佳的做法是,在基表上使用SELECT DISTINCT来获取所有月份。
create table x (
monthyear varchar2(20),
id varchar2(10)
);
insert into x values('02/18', 'A32');
insert into x values('04/19', 'T39');
insert into x values('05/19', 'T39');
insert into x values('04/19', 'Y95');
insert into x values('01/18', 'A32');
insert into x values('12/19', 'I99');
insert into x values('11/18', 'OPT');
insert into x values('09/19', 'TT8');
查询:
with allmonths as(
select distinct monthyear from x
),
firstmonths as(
select id, to_char(min(to_date(monthyear, 'MM/YY')),'MM/YY') monthyear from x group by id
),
firstmonthcounts as(
select monthyear, count(*) cnt
from firstmonths group by monthyear
)
select am.monthyear, nvl(fmc.cnt, 0) as newusers
from allmonths am left join firstmonthcounts fmc on am.monthyear = fmc.monthyear
order by to_date(monthyear, 'MM/YY');