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_ID
s 的数量,以及在该 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_ID
s。这可以使用GROUP BY
和HAVING
来完成,也可能使用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 BY
和Product_ID
。以上是关于SQL - 在两个日期之间分组和过滤的主要内容,如果未能解决你的问题,请参考以下文章
NSPredicate 在 NSString 类型的两个日期之间进行过滤