计算ID以获取正确的创建日期时间

时间:2019-06-05 20:13:09

标签: sql

我需要获取每个月的用户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

3 个答案:

答案 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');