首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算正确创建日期时间的ID

计算正确创建日期时间的ID
EN

Stack Overflow用户
提问于 2019-06-06 04:13:09
回答 3查看 21关注 0票数 0

我需要获取每个月的用户ID的数量,但只有当用户的最小月份落在该月内时,才应计算该月的用户ID。

因此,如果客户A的分钟(天)为04/18,那么对于月份和年份,将对它们进行计数。

我的表格如下所示:

代码语言:javascript
运行
复制
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

我在做类似这样的事情:

代码语言:javascript
运行
复制
SELECT day, id 
SUM(CASE WHEN month = min(day) THEN 1 ELSE 0)
FROM testtable
GROUP BY 1

但是我不确定如何为每个用户ID指定,所以只有用户ID = 1,当他们的min( day ) =day时

目标表为:

代码语言:javascript
运行
复制
monthyear | count  
01/18       1
02/18       0 
11/18       1
04/19       2
05/19       0
09/19       1
12/19       1
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-06 04:51:56

使用窗口函数。让我假设您的monthyear实际上是yearmonth,所以它可以正确排序:

代码语言:javascript
运行
复制
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;

如果您有荒唐的月-年格式,那么您可以使用字符串操作。这些依赖于数据库,但如下所示:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2019-06-06 04:38:27

我假设您有一个日期列(使用min()是必要的)。您可以这样做:为每个id选择一个minimal date(子查询t2),然后只计算通过left join连接的这些行,因此如果没有连接,则这些日期或monthyear的值将为零,就像您在数据中所做的那样。

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2019-06-06 04:47:30

您正在寻找每月的新用户数量,对吗?

这里有一种方法可以做到。请注意,我必须使用TO_DATE和TO_CHAR来确保月份/年份文本字符串排序正确。如果您使用实际的日期列,则不需要这样做。

一个额外的复杂性是添加空的月份(新用户为零的月份)。最好,这不能通过在基表上使用SELECT DISTINCT来获取所有月份来实现。

代码语言:javascript
运行
复制
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');

和查询:

代码语言:javascript
运行
复制
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');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56467357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档