Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-分组依据和两个日期之间的筛选_Sql_Group By_Having - Fatal编程技术网

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。