根据日期从时间范围获取数据

时间:2020-02-19 14:09:03

标签: sql google-bigquery

我正在尝试从发送通知之前和之后的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

1 个答案:

答案 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)