【问题标题】:Athena query on sales data with 7-day time frameAthena 以 7 天的时间范围查询销售数据
【发布时间】:2020-12-29 13:41:25
【问题描述】:

sample_input_table

user  name  action      date             collection
 1    aaa    view      2020-09-03       {id:"888"}
 1    aaa    view      2020-09-02       {id:"999"}
 2    bbb    view      2020-09-02       {id:"555"}
 3    ccc    view      2020-08-28       {id:"777"}
 4    ddd    view      2020-08-25       {id:"666"}
 1    aaa    purchase  2020-09-09       {operation:"purchase"}

我有一个包含大量行数的表,该表如上所示。

问题

  1. 我想打印具有purchase 操作的行并且
  2. 同时,执行purchase的用户必须有view操作的行
  3. 同时,view 操作将在 purchase_date(2020-09-09) 和 purchase_date - 7days(2020-09-02) 的日期范围内。
  4. 最后,我想要一行包含purchase 操作,我需要一个新列collection_1
  5. 这个collection_1 列包含collection 值,我们将从viewrows 中获取它,它具有min(date)

我想在一个sql查询中实现这5点

sample_output

user  name  action      date          collection               collection_1
1    aaa    purchase  2020-09-09      {operation:"purchase"}    {id:"999"}

如果我们看到来自样本输入的样本输出

  1. 我们的最终结果只有 purchase_events
  2. purchased_user 有一行 view 操作
  3. 并且 view2020-09-092020-09-02(购买日期,购买日期 - 7 天)的时间范围内存在
  4. 我们有新列collection_1,我们从view 行中获取值,该行具有min(date)

谁能为此提出一些解决方案?

【问题讨论】:

    标签: sql amazon-web-services subquery presto amazon-athena


    【解决方案1】:

    我可以试试:

    WITH cte AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY user ORDER BY date) rn
        FROM sample_input_table t1
        WHERE action = 'view' AND
              EXISTS (SELECT 1 FROM sample_input_table t2
                      WHERE t2.user = t1.user AND
                      t2.action = 'purchase' AND
                      DATEDIFF(day, t1.date, t2.date) BETWEEN 0 AND 7)
    )
    
    SELECT t1.*, t2.collection AS collection_1
    FROM sample_input_table t1
    INNER JOIN cte t2
        ON t1.user = t2.user
    WHERE t1.action = 'purchase' AND t2.rn = 1;
    

    Demo

    上面的策略是首先为每个用户查找所有view记录,对于同一用户,这些记录具有对应的purchase记录。我们还根据日期计算行号,因此我们知道哪些视图记录对应于最早的日期。通过将此 CTE 加入您的原始表,然后限制为第一行号,我们可以找到您想要的匹配项。

    注意:演示是在 SQL Server 中,但它应该在 Athena 上运行,几乎不需要修改。

    【讨论】:

    • 嗨蒂姆,我们错过了 7 天的时间框架条件。我在问题点 3 中提到过。所有视图都将在 7 天的时间范围内
    • @siva 我已按照您的建议添加了对 7 天范围的检查。
    • 有没有其他方法可以使用联接或使用子查询?
    • 我的方法使用连接和子查询:-)
    • 抱歉,我的意思是不使用WITH 语句
    猜你喜欢
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2021-03-26
    • 2019-05-26
    • 2014-05-07
    • 1970-01-01
    相关资源
    最近更新 更多