首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL创建一个新的日期列,以根据日期时间字段计算计数。

SQL创建一个新的日期列,以根据日期时间字段计算计数。
EN

Stack Overflow用户
提问于 2022-11-01 11:18:56
回答 2查看 45关注 0票数 2

我有一个表显示订阅,列表示活动日期,列显示非活动日期。我需要一个查询,它计算一个日期范围内每个特定日期的活动订阅数。

我很难为我的日期范围中的每个日期添加一行,以便与表中的其他日期列进行比较。

我的桌子的例子

我需要的结果的例子

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-01 13:21:08

你可以这样做:

代码语言:javascript
运行
复制
-- SAMPLE DATA
WITH
    tbl AS
        (
            Select 'A' "A_TYPE", 1 "SUBSCRIPTION_ID", To_Date('10.10.2022', 'dd.mm.yyyy') "ACTIVE_DATE", Null "INACTIVE_DATE" From Dual Union All
            Select 'A' "A_TYPE", 2 "SUBSCRIPTION_ID", To_Date('11.10.2022', 'dd.mm.yyyy') "ACTIVE_DATE", To_Date('14.10.2022', 'dd.mm.yyyy') "INACTIVE_DATE" From Dual Union All
            Select 'A' "A_TYPE", 3 "SUBSCRIPTION_ID", To_Date('12.10.2022', 'dd.mm.yyyy') "ACTIVE_DATE", To_Date('14.10.2022', 'dd.mm.yyyy') "INACTIVE_DATE" From Dual Union All
            Select 'B' "A_TYPE", 4 "SUBSCRIPTION_ID", To_Date('13.10.2022', 'dd.mm.yyyy') "ACTIVE_DATE", Null "INACTIVE_DATE" From Dual Union All
            Select 'B' "A_TYPE", 5 "SUBSCRIPTION_ID", To_Date('14.10.2022', 'dd.mm.yyyy') "ACTIVE_DATE", To_Date('18.10.2022', 'dd.mm.yyyy') "INACTIVE_DATE" From Dual Union All
            Select 'B' "A_TYPE", 6 "SUBSCRIPTION_ID", To_Date('15.10.2022', 'dd.mm.yyyy') "ACTIVE_DATE", Null "INACTIVE_DATE" From Dual 
        ),

为A_TYPE生成日期:在这里您可以定义范围开始日期(09.10.2022)和希望范围持续多久(级别<= 11)。

代码语言:javascript
运行
复制
    dates AS
        (
            Select Distinct
                t.A_TYPE "A_TYPE",
                d.RANGE_DATE "RANGE_DATE"
            From 
                (Select To_Date('09.10.2022', 'dd.mm.yyyy') + LEVEL - 1 "RANGE_DATE" From dual Connect By LEVEL <= 11) d
            Left Join
                tbl t ON(1 = 1)
            Order By 
                t.A_TYPE,
                d.RANGE_DATE
        )

和主SQL:

代码语言:javascript
运行
复制
SELECT
    d.A_TYPE "A_TYPE",
    d.RANGE_DATE "RANGE_DATE",
    (Select Count(*) From tbl Where A_TYPE = d.A_TYPE And ACTIVE_DATE <= d.RANGE_DATE And Nvl(INACTIVE_DATE, To_Date('11.10.2062', 'dd.mm.yyyy')) > d.RANGE_DATE) "ACTIVE_COUNT"
FROM
    dates d

其结果是:

代码语言:javascript
运行
复制
/*
A_TYPE RANGE_DATE ACTIVE_COUNT
------ ---------- ------------
A      09-OCT-22             0 
A      10-OCT-22             1 
A      11-OCT-22             2 
A      12-OCT-22             3 
A      13-OCT-22             3 
A      14-OCT-22             1 
A      15-OCT-22             1 
A      16-OCT-22             1 
A      17-OCT-22             1 
A      18-OCT-22             1 
A      19-OCT-22             1 
B      09-OCT-22             0 
B      10-OCT-22             0 
B      11-OCT-22             0 
B      12-OCT-22             0 
B      13-OCT-22             1 
B      14-OCT-22             2 
B      15-OCT-22             3 
B      16-OCT-22             3 
B      17-OCT-22             3 
B      18-OCT-22             2 
B      19-OCT-22             2
*/

问候..。

票数 2
EN

Stack Overflow用户

发布于 2022-11-01 11:36:47

代码语言:javascript
运行
复制
SELECT 
type,
TO_DATE(date, 'DD-MM-YYYY') as date,
count(date) AS count_of_dates
FROM table
GROUP BY type, date
ORDER BY type
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74275099

复制
相关文章

相似问题

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