【问题标题】:SQL find latest child status entry on an monthly aggregationSQL 在每月聚合中查找最新的子状态条目
【发布时间】:2020-10-28 18:23:51
【问题描述】:

我在 BigQuery 数据库中有两个表:“project”和“project_status”...

project
Id  Name
1   XXXX
2   YYYY
3   ZZZZ

project_status
project_id   status_date  status
1              2 Jan 2020    Good
2              4 Feb 2020    Bad
3              5 Feb 2020    On track
3              6 March 2020  Bad

我想制作一份项目状态的月度报告。项目的状态不会每月更新。在这种情况下,截至月底的最新状态条目将被视为最新状态

Month       Project  Status
Jan 2020      XXXX     Good
Feb 2020      XXXX     Good
Mar 2020      XXXX     Good
Jan 2020      YYYY     null
Feb 2020      YYYY     Bad
Mar 2020      YYYY     Bad
Jan 2020      ZZZZ     null
Feb 2020      ZZZZ     On track
Mar 2020      ZZZZ     Bad

例如,对于项目“XXXX”,2020 年 2 月或 2020 年 3 月没有状态更新,因此状态将取自 2020 年 1 月 2 日的最新状态条目。

关于如何构建 SQL 查询以提供此报告的任何建议?

【问题讨论】:

  • 您使用的是哪种 DBMS 产品? “SQL”只是所有关系数据库都使用的一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tagWhy should I tag my DBMS

标签: sql google-bigquery


【解决方案1】:

考虑使用GENERATE_DATE_ARRAY AND ARRAY_AGG

WITH Months AS (
  SELECT DATE_SUB(month, INTERVAL 1 DAY) AS last_day
  FROM UNNEST(GENERATE_DATE_ARRAY('2020-02-01', '2020-04-02', INTERVAL 1 MONTH)) AS month
),
Projects as (
  SELECT 1 AS Id, 'XXXX' AS Name UNION ALL
  SELECT 2 AS Id, 'YYYY' AS Name UNION ALL
  SELECT 3 AS Id, 'ZZZZ' AS Name
),
Project_Status as (
  SELECT 1 AS project_id, PARSE_DATE('%e %b %Y', '2 Jan 2020') AS status_date, 'Good' AS status UNION ALL
  SELECT 2, PARSE_DATE('%e %b %Y', '4 Feb 2020'), 'Bad' UNION ALL
  SELECT 3, PARSE_DATE('%e %b %Y', '5 Feb 2020'), 'On track' UNION ALL
  SELECT 3, PARSE_DATE('%e %b %Y', '6 March 2020'), 'Bad'
)
SELECT Projects.Name as Name, DATE_TRUNC(Months.last_day, MONTH) AS Month,
  ARRAY_AGG(Project_Status.status ORDER BY status_date DESC)[OFFSET(0)]  AS Status
FROM Projects 
CROSS JOIN Months 
LEFT JOIN Project_Status ON 
  Project_Status.project_id = Projects.id
  AND Project_Status.status_date <= Months.last_day
GROUP BY Name, Month

输出是:

【讨论】:

  • 当我将 yuur 建议转换为查询时,我收到一个错误:查询执行失败:- 不支持引用其他表的相关子查询,除非它们可以去相关,例如通过转换它们进入高效的 JOIN。
  • ARRAY_AGG 帮助
猜你喜欢
  • 2017-02-18
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多