【发布时间】:2020-04-16 23:18:46
【问题描述】:
假设我有一个包含以下列的表格:
date | event | user_id | unit_id |cost | ad_id | spend
03-15 | impression | 2353 | 3436 | 0.15 | NULL | NULL
03-15 | impression | 2353 | 3436 | 0.12 | NULL | NULL
03-15 | impression | 1234 | 5678 | 0.10 | NULL | NULL
03-15 | click | 1234 | 5678 | NULL | NULL | NULL
03-15 | create_ad | 1234 | 5678 | NULL | 6789 | 10
我想计算在用户创建 ID 之前平均需要多少次展示。 在此特定场景中,用户 1234 需要一次印象才能创建广告。
我不确定我能否以某种方式使用 date 来区分事件(但从逻辑上讲,所有这些事件都应该在不同的时刻发生)。但是,您可以看到,impressions 在 ad_id 和 spend 中有 NULL,而 create_id 在 spend 中有一个数字。
这个不行:
select i.user_id
, i.unit_id
, count(i.event) impressions_n
, count(c.event) as ads_n
from add4ad i
left
join add4ad c
on i.user_id = c.user_id
and i.unit_id = c.unit_id
where i.event in ('impression')
and c.spend <> NULL
group
by i.user_id
, i.unit_id
我用这些数据创建了一个SQLFiddle
【问题讨论】:
-
将
c.spend <> NULL更改为c.spend is not NULL并检查您是否得到正确的结果。 -
它运行但结果不正确(即它不返回任何结果)。
-
那么你必须更好地解释你需要什么并提供预期的结果。另外:...在用户创建 id 之前平均需要多少次展示... 只有在有按日期定义的订单时才有意义,而这里的情况并非如此,因为所有日期都相等。
-
你的小提琴数据不同,真的没有返回数据。您的问题数据应返回一行。
-
@forpas,这很公平,我在小提琴中添加了更多数据。现在它有更多天数的数据,因此可以定义一些顺序。
标签: mysql sql join left-join self-join