我正在尝试从发送通知之前和之后的30天时间范围内获取数据。我试过下面的查询,但它不能完全给我我想要的东西。 created_at字段是发送消息的日期。我正在尝试在发送消息的日期和字段epaper_opens之间建立关联。为此,我正在查看created_at事件发生前后的30天间隔。
SELECT state,
epaper_opens,
CAST(created_at AS date) AS Date,
COUNT(created_at) AS Sent
FROM analytics.fct_notifications
LEFT JOIN analytics.fcts_customer_activity_agg
ON fct_notifications.customer_id = fcts_customer_activity_agg.subscription_id
WHERE DATE > DATE_SUB(CAST(created_at AS date), INTERVAL 30 DAY)
AND DATE < DATE_ADD(CAST(created_at AS date), INTERVAL 30 DAY)
GROUP BY 1, 2, 3
ORDER BY 3 DESC
答案 0 :(得分:1)
同意@Gordon Linoff所说的话,了解表结构,获得的结果和所需的结果将很有帮助。
我使用与您使用的相同的WHERE子句在BQ中重新创建了一个类似的场景,并且效果很好,除了间隔限制不包含在内(因为您使用的是<和>运算符,而不是<=和> =),因此,您实际上是在created_at日期之前29天和之后29天获得结果的;当您说查询没有给您想要的所有结果时,这就是您所指的吗?
如果是这种情况,您可以尝试使用上述运算符:
WHERE DATE >= DATE_SUB(CAST(created_at AS date), INTERVAL 30 DAY)
AND DATE <= DATE_ADD(CAST(created_at AS date), INTERVAL 30 DAY)
或者您也可以使用具有包容性限制的BETWEEN运算符:
WHERE DATE BETWEEN DATE_SUB(CAST(created_at AS date), INTERVAL 30 DAY)
AND DATE_ADD(CAST(created_at AS date), INTERVAL 30 DAY)