【问题标题】:Updating a character variable based on most recent date and then counting records by group in SQL根据最近的日期更新字符变量,然后在 SQL 中按组计算记录
【发布时间】:2023-03-24 17:17:01
【问题描述】:

我正在使用 SQLite3 进行以下查询。

我有一个名为“产品”的表,如下所示:

我有一个名为“事务”的表,如下所示:

我有一个名为“segments”的表格,看起来像这样。 请注意,变量“active_flag”表示该段是否处于活动状态。

我的目标是

  1. 更新每个客户的活跃细分,基于他们的交易
  2. 提供每个更新细分中的客户数量。

以下是更新细分的方法:

  • 如果客户在当天或之后进行了首次交易,则将该段标记为“NEW2” '2016-03-01'。
  • 如果客户没有进行任何操作,则将该段标记为“未激活” 自“2016-03-01”以来的交易。

我知道我需要先找到最新的交易日期。我可以这样做:

select t.cust_id, t.trans_id, s.seg_name, s.active_flag, max(t.trans_dt) as latest_transaction_date
from transactions t 
JOIN segments s
on t.cust_id = s.cust_id
GROUP by t.cust_id;

最后,当我拥有所有客户及其更新细分时,我知道我可以使用 groupby 计算每个细分中的客户数量。但是,我正在为中间步骤而苦苦挣扎。

对我来说最困难的部分是更新一个我从未做过的专栏。

输出应该是这样的。

 seg_name    count_cust
    ONE-OFFS    11
    LOYAL       15
    NEW2        17

【问题讨论】:

    标签: sql join group-by


    【解决方案1】:

    这里是如何更新段:

    update segments 
    set active_flag = case when first_transaction_date >= '2016-03-01' 
      then true 
      else false 
    end 
    from 
    (
    select cust_id , min(trans_dt) first_transaction_date 
    from transaction 
    group by cust_id
    ) tr
    where segments.cust_id = tr.cust_id
    

    获取每个细分市场中的客户数量:

    select seg_name
            , count(*) count_total
            , count(distinct cust_id)  count_distinct_customer
    from segments
    group by seg_name 
    

    【讨论】:

    • 感谢您的快速回复,但它不起作用。在别名“s”附近的第一行中存在语法错误。我将表名固定为“段”,但这并没有消除错误。您认为可能有什么问题?
    • "::timestamp" 引起了问题,所以我删除了它。我认为不等式仍然有效,因为最小日期从午夜(00:00:00)开始。除了这个问题,您如何将“NEW2”值合并到 seg_name 中?我知道你重新定义了active_flag,但是段名也需要更新。
    • 1) New2 需要一个右引号。 2) 为什么我们将 seg_name 与 NEW2 连接起来?我的目标是在 seg_name 下创建一个名为 NEW2 的新值,如果它满足 2016-03-01 的条件。 3)我将表的名称更正为“事务”。
    • 您想在段表中添加一条名为“NEW2”的新记录吗?
    • 是的 - 请参阅我的问题末尾预期输出中的最后一行。 NEW2 是新的分段名称。
    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2017-07-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多