【问题标题】:How to get a count of the times the first occurrence of an unique ID is on a specific day?如何计算特定日期第一次出现唯一 ID 的次数?
【发布时间】:2020-01-23 02:48:58
【问题描述】:

所以我有两张桌子:

客户维度:

sk_customer | first_name | last_name | acq_channel | acq_date |  customer_id
-----------------------------------------------------------------------------
411           Alex          Hum       Offline        2019-03-02  44586344
422           Eric          Spong     Offline        2019-02-02  44323233
447           Eddie         Peng      TV             2019-05-07  44782233

boxes_shipped:

box_id | fk_box_sku | fk_customer | fk_geography | week |  delivery_date
----------------------------------------------------------------------------
123      321          447           Syd            2       2019-04-02      
124      322          422           WA             3       2019-02-05
125      323          411           WA             4       2019-05-07

fk_customer 通过外键约束引用 sk_customer。

我想找到一种方法来计算在星期二第一次出现 fk_customer 的次数,即计算在星期二收到第一个盒子的人数。因此,如果客户在星期二订购了第二盒,则不会增加数量。

如何编写查询以查看交货日期是否为星期二?然后只计算第一次出现的 fk_customer?

【问题讨论】:

    标签: sql count dml


    【解决方案1】:

    参考您的要求,

    • 要计算每个日期的 fk_customer 订单,您可以使用 group by delivery_date, fk_customer 并在其上使用 count(*) 聚合器。

    • 要从 date 中获取特定的日期名称,您可以搜索特定于您的 DBMS 的库函数。

    您所需查询的 MySQL 实现将是:

    select count(*) repeatedOrders, fk_customer, delivery_date from boxes_shipped group by delivery_date, fk_customer where dayname(delivery_date) = 'Tuesday'.
    

    【讨论】:

    • 我尝试过类似的方法:select count(*) as 'Tuesday First Delivery' from boxes_shipped where DATE_FORMAT(delivery_date,'%a') = 'Wed' group by delivery_date; 有没有办法让查询根据日期仅计算 fk_customer 的第一次出现?
    • 是的,您需要使用 rank() 对特定日期的单个订单进行排名,然后您可以按 rank=1 进行过滤。
    • 你可以尝试这样的事情,select rank() over(partition by delivery_date, fk_customer) as 'Tuesday First Delivery' from boxes_shipped where DATE_FORMAT(delivery_date,'%a') = 'Tue' 虽然没有测试,检查一次,然后你可以按 rank 为 1 进行过滤,检查 this 以供参考。
    【解决方案2】:

    我会推荐两个级别的聚合:

    select count(*)
    from (select fk_customer, min(delivery_date) as first_delivery_date
          from boxes_shipped
          group by fk_customer
         ) c
    where dayname(first_delivery_date) = 'Tuesday';
    

    【讨论】:

      【解决方案3】:

      如果有人想知道,我用过:

      with order_values as(
           select *, rank() over(partition by delivery_date,fk_customer)
      as order_value_rank
      from boxes_shipped
      where DATE_FORMAT(delivery_date, '%a') = 'Tues'
      )
      
      select count(*) as 'Number of people that received their 1st box on Tues'
      from order_values
      where order_value_rank =1;
      

      【讨论】:

      • 如果您发现我的回答有影响,请将其标记为回答,谢谢。
      猜你喜欢
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 2016-11-11
      • 2020-01-02
      • 2015-09-14
      相关资源
      最近更新 更多