我需要获取每个月的用户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指定,所以只有用户ID = 1,当他们的min( day ) =day时
目标表为:
monthyear | count
01/18 1
02/18 0
11/18 1
04/19 2
05/19 0
09/19 1
12/19 1
发布于 2019-06-06 04:51:56
使用窗口函数。让我假设您的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;
发布于 2019-06-06 04:38:27
我假设您有一个日期列(使用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
发布于 2019-06-06 04:47:30
您正在寻找每月的新用户数量,对吗?
这里有一种方法可以做到。请注意,我必须使用TO_DATE和TO_CHAR来确保月份/年份文本字符串排序正确。如果您使用实际的日期列,则不需要这样做。
一个额外的复杂性是添加空的月份(新用户为零的月份)。最好,这不能通过在基表上使用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');
https://stackoverflow.com/questions/56467357
复制相似问题