SQL-分组依据和两个日期之间的筛选
我有这样一个消费表:SQL-分组依据和两个日期之间的筛选,sql,group-by,having,Sql,Group By,Having,我有这样一个消费表: 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
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 | Start_Date | End_Date | Active_During_30_Days | Purchased_10_Units | Pct
1 | 06/18/20 | 07/18/20 | 356891 | 5467 | 0.01532
我想做的是针对每个产品,查看产品可用的前30天,假设开始日期是给定产品的消费表中购买的最小日期,并计算购买>=10个单位的唯一帐户ID的数量,以及在该30天窗口内活跃的唯一帐户总数,其中活跃表示他们在该30天内购买了任何东西,因此我可以获得在该30天窗口内至少购买了10个产品单位的活跃帐户的百分比
我可以这样做,以获得每个独特产品ID的30天窗口:
但我正在努力解决如何过滤每个30天窗口内购买的日期,然后统计活跃的不同帐户,以及购买>=10个单位的帐户数。如果我只有一个30天的窗口/产品可以查看,我显然可以把它放在何处,但我有数百个产品ID。这可以通过分组完成吗?可能是在什么时候?抱歉,如果这是一个非常基本的问题。我期望的输出如下所示:
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 | Start_Date | End_Date | Active_During_30_Days | Purchased_10_Units | Pct
1 | 06/18/20 | 07/18/20 | 356891 | 5467 | 0.01532
非常感谢您的帮助。使用窗口功能:
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;
注意:这使用标准的日期函数。您可能需要调整数据库。您的代码不是MySQL代码。请正确标记问题。谢谢您的回答。但我相信这只是计算在30天窗口内购买产品ID的不同帐户的数量。我希望num_accounts是在30天窗口内购买任何东西的帐户数,即活动帐户。再次感谢。@jj445。只需从SELECT中删除GROUP BY和Product_ID。