SQL - 在两个日期之间分组和过滤

Posted

技术标签:

【中文标题】SQL - 在两个日期之间分组和过滤【英文标题】:SQL - Group By and Filtering Between Two Dates 【发布时间】:2021-07-30 02:16:26 【问题描述】:

我有一个这样的消费表:

Account_ID | Product_ID | Date_Purchased | Amount_Purchased
         1 |         57 |       05/26/20 |               14
         7 |         14 |       09/18/19 |               12
        45 |         104 |      08/27/20 |                3

我要做的是为每个Product_ID 查看产品可用的前 30 天(假设开始日期是给定产品消耗表中Date_Purchased 的最小值)并计算购买 >= 10 个单位 (Amount_Purchased) 的唯一 Account_IDs 的数量,以及在该 30 天窗口内活跃的唯一帐户总数(其中“活跃”表示他们在这些时间段内购买了任何东西) 30 天),这样我就可以获得在 30 天窗口内购买了至少 10 件产品的活跃账户的百分比。

我可以做这样的事情来获得每个唯一Product_ID 的 30 天窗口:

SELECT 
    Product_ID, 
    MIN(Date_Purchased) as Start_Date, 
    TO_CHAR(DATEADD(day, 30, Start_Date), 'YYYY-MM-DD') as End_Date
FROM consumption_table
GROUP BY Product_ID

但我正在努力解决如何在每个 30 天的窗口内过滤 Date_Purchased,然后计算活跃的不同帐户,以及购买 >= 10 个单位的帐户计数。如果我只有一个 30 天的窗口/产品要查看,我显然可以将其放入 WHERE,但我有数百个 Product_IDs。这可以使用GROUP BYHAVING 来完成,也可能使用CASE WHEN?对不起,如果这是一个非常基本的问题。我想要的输出看起来像这样:

Product_ID | Start_Date | End_Date | Active_During_30_Days | Purchased_10_Units | Pct
         1 |   06/18/20 | 07/18/20 |                356891 |               5467 | 0.01532

非常感谢您的帮助。

【问题讨论】:

您的代码不是 mysql 代码。请正确标记问题。 【参考方案1】:

使用窗口函数:

SELECT Product_ID, 
       COUNT(DISTINCT CASE WHEN amount_purchased > 10 THEN Account_Id END) as num_big_accounts,
       COUNT(DISTINCT Account_ID) as num_accounts,
       ( COUNT(DISTINCT CASE WHEN amount_purchased > 10 THEN Account_Id END) /
         COUNT(DISTINCT Account_ID)
       ) as ratio
FROM (SELECT c.*,
             MIN(Start_Date) OVER (PARTITION BY Product_ID) as min_Start_date
      FROM consumption_table c
     ) c
WHERE Start_Date < min_Start_Date + INTERVAL '30 day'
GROUP BY Product_ID;

注意:这使用标准日期函数。您可能需要针对您的数据库进行调整。

【讨论】:

感谢您的回复。但我相信这只是计算在 30 天窗口内购买 Product_ID 的不同帐户的数量。我正在寻找 num_accounts 是在 30 天窗口内购买任何东西的帐户数(“活动”帐户)。再次感谢。 @jj445 。 . .只需从SELECT 中删除GROUP BYProduct_ID

以上是关于SQL - 在两个日期之间分组和过滤的主要内容,如果未能解决你的问题,请参考以下文章

SQL 日期过滤器:当开始日期 = 结束日期时返回结果

在excel vba中的两个日期之间过滤

在两个日期选择器之间过滤数据表

NSPredicate 在 NSString 类型的两个日期之间进行过滤

使用 VBA 在数据透视表中的两个日期之间进行过滤。英国到美国的日期格式问题

通过高级 SQL 过滤器进行 OBIEE11g 日期操作/比较