【问题标题】:Issue with aggregating data when data missing on certain dates在某些日期缺少数据时聚合数据的问题
【发布时间】:2021-10-25 17:48:31
【问题描述】:

我如何编辑以下 SQL 查询以获取每天和每个变体的结果,其中我有一个 A/B/Control 测试:

SELECT 
    t.day, t.type AS variant_type, t.clicks, 
    t2.type AS control, t2.control_clicks
FROM 
    table1 t
LEFT JOIN 
    table1 t2 ON t.day = t2.day
              AND t2.type = 'control'

目前,只有在 from 子句中有给定日期的数据时,才会出现数据。当进一步聚合数据时,这会导致问题。

当前结果:

day variant variant_clicks control control_clicks
2020-01-01 a 1000 control 1500
2020-01-01 b 2000 control 1500
2020-01-01 control 1500 control 1500
2020-01-02 control 1700 control 1700

期望的结果:

day variant variant_clicks control control_clicks
2020-01-01 a 1000 control 1500
2020-01-01 b 2000 control 1500
2020-01-01 control 1500 control 1500
2020-01-02 a 0 control 1700
2020-01-02 b 0 control 1700
2020-01-02 control 1700 control 1700

任何帮助将不胜感激!

【问题讨论】:

    标签: sql postgresql date join data-analysis


    【解决方案1】:

    您可以使用cross join 生成行,然后使用left join 引入现有数据:

    SELECT d.day, v.type as variant_type,
           COALESCE(t.clicks, 0) as clicks, 'control' as control,
           MAX(t.clicks) FILTER (WHERE type = 'control') OVER (PARTITOIN BY d.day) as control_clicks
    FROM (SELECT DISTINCT day FROM table1) d CROSS JOIN
         (VALUES ('a', 'b', 'control')) v(type) LEFT JOIN
         table1 t
         ON t.day = d.day AND t.type = v.type;
    

    注意:这使用窗口函数来获取控件点击而不是单独的聚合和join

    【讨论】:

    • 感谢@marc_s。这几天一直想使用交叉连接,然后不确定下一步该做什么你知道是否有一种方法可以在不指定值的情况下做到这一点吗?当我使用不同数量的变体运行测试时 - 即 Control/A、Control/A/B/.../n、A/B/C(我们将使用 A 代替对照组)?
    • @CharlieB 。 . .您可以使用子查询。 . . (select distinct type from table1).
    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 2015-08-03
    • 1970-01-01
    • 2020-08-22
    • 2012-03-03
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    相关资源
    最近更新 更多