首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Bigquery PartitionTable中检查任何缺少的天数记录

在Bigquery PartitionTable中检查任何缺少的天数记录
EN

Stack Overflow用户
提问于 2020-04-15 23:05:01
回答 2查看 136关注 0票数 0

我有一个带有日期分区键的Bigquery表。我在该表中获得每日记录,并尝试查找是否有丢失的三年历史数据。因此,我尝试使用以下查询:

代码语言:javascript
运行
复制
SELECT KeyPartitionDate
FROM (
  SELECT KeyPartitionDate, DATE(KeyPartitionDate) as day, DATE_ADD(date(KeyPartitionDate), INTERVAL 1 DAY) AS dayplusone
  FROM `project.dataset.table`
)
WHERE DATE_DIFF(day, dayplusone , DAY) > 1
GROUP BY KeyPartitionDate
ORDER BY KeyPartitionDate 

查询是有效的,但不返回任何结果,而我知道有一些...我的猜测是我搞乱了DATE_ADD函数,但不知道是怎么搞的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-15 23:46:11

以下是针对BigQuery标准SQL的说明,仅提供缺少天数的列表

代码语言:javascript
运行
复制
#standardSQL
SELECT day AS missing_days 
FROM (
  SELECT MIN(KeyPartitionDate) min_day, MAX(KeyPartitionDate) max_day
  FROM `project.dataset.table`
), UNNEST(GENERATE_DATE_ARRAY(min_day, max_day)) day
LEFT JOIN (
  SELECT DISTINCT KeyPartitionDate AS day
  FROM `project.dataset.table`
) t 
USING(day)
WHERE t.day IS NULL
票数 2
EN

Stack Overflow用户

发布于 2020-04-15 23:21:20

你走错了路:

代码语言:javascript
运行
复制
day = DATE(KeyPartitionDate)

然后你就这么做了

代码语言:javascript
运行
复制
dayplusone  = DATE_ADD(date(KeyPartitionDate), INTERVAL 1 DAY) 

这基本上是说dayplusone = day +(1天)

然后你就可以做到:

代码语言:javascript
运行
复制
WHERE DATE_DIFF(day, dayplusone , DAY) > 1

这就像是说: dayplusone - day > (1天),这意味着

代码语言:javascript
运行
复制
day + (1 day) - day > (1 day)

你可以清楚地看到为什么这是错误的。

相反,您需要做的是将当前行日期与以前的行日期进行比较。这是使用窗口函数实现的:

代码语言:javascript
运行
复制
SELECT KeyPartitionDate FROM (
SELECT DISTINCT KeyPartitionDate,
  LAG(KeyPartitionDate)
    OVER (ORDER BY KeyPartitionDate ASC) AS PreviousKeyPartitionDate
FROM `project.dataset.table`) 
WHERE DATE_DIFF(DATE(PreviousKeyPartitionDate),DATE(KeyPartitionDate), DAY ) > 1
ORDER BY KeyPartitionDate 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61232058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档