如何在 Athena (Presto) 中使用上个月的月度间隔?
How to work with a monthly interval of the last month in Athena (Presto)?
我正在开发一个将 运行 在 AWS QuickSight 上进行的查询,每月从我们在 AWS Athena 中的数据库中获取信息(上个月的第一天到上个月的最后一天)。
为了做到这一点,我设置了一个时间间隔,查询从 Athena 获取日期并将其用于 WHERE 子句,如下所示:
SELECT
date_format(date_parse(REPLACE(eventtimestamp, ' ', ' 0'), '%a %b %d %T %Y'), '%Y-%m') AS month,
COUNT(DISTINCT(SUBSTR(UPPER(REPLACE(REPLACE(r.stationid, ':', ''), '-', '')),1, 12))) as qty_uniq_aps,
count(*) AS qtd_of_sessions
FROM example.tableexample_parquet r
WHERE r.dt >= from_iso8601_date(CONCAT(CAST(extract(year FROM current_date) AS varchar(4)),
'-',
CAST(extract(month FROM current_date) AS varchar(2)),
'-01'
))
GROUP BY 1
ORDER BY 1;
正在查看:
WHERE r.dt >= from_iso8601_date(CONCAT(CAST(extract(year FROM current_date) AS varchar(4)),
'-',
CAST(extract(month FROM current_date) AS varchar(2)),
'-01'
))
这是一个示例:此代码将采用 actual_year-actual_month-first_day_of_month 的间隔,如下所示:
2020-07-01 >= the newest registry in database
我真的很想让它变得聪明。我想在带有 Between 的 Where 子句中转换它,如下所示:
WHERE r.dt BETWEEN actual_year-last_month-first_day_of_month AND actual_year-last_month-last_day_of_month
问题是:
A) 月份的最后一天会随月份而变化(例如,有些月份有 30 天,有些月份有 31 天,还有一些月份有 28 或 29 天)。
B) 我在这个 link https://prestosql.io/docs/current/functions/datetime.html 中找到了一个名为 last_day_of_month(x) 的函数,但在 Athena 上不起作用。
我想问你一些关于如何解决这个问题的想法。我在 PrestoDB 文档中搜索了与日期和时间相关的函数,但我不知道如何在没有 last_day_of_month(x) 的情况下实现这一点。
即使有了这个答案,我也可以将 where 子句与 r.dt >= the first day of last month 一起使用,并在每月的第一天对 QuickSight 进行 运行 查询。但我正在寻找一个解耦的解决方案。谢谢!
如果真的要查询整个月份,只需要比较年月就可以了(根本不需要知道天数),所以应该比较年月的“字符串”,并且确定月份总是两位数(例如 07
)。这将完成工作:
WHERE date_format ( r.dt, '%Y-%m' ) = date_format ( current_date, '%Y-%m' )
如果你想运行上个月的查询,但你现在已经在新的月份,你应该从当前时间减去一些天数以获得上个月(如果你在一年的最后一个月..).
所以 current_date
写成:
date_add('day', -7, current_date)
我正在开发一个将 运行 在 AWS QuickSight 上进行的查询,每月从我们在 AWS Athena 中的数据库中获取信息(上个月的第一天到上个月的最后一天)。
为了做到这一点,我设置了一个时间间隔,查询从 Athena 获取日期并将其用于 WHERE 子句,如下所示:
SELECT
date_format(date_parse(REPLACE(eventtimestamp, ' ', ' 0'), '%a %b %d %T %Y'), '%Y-%m') AS month,
COUNT(DISTINCT(SUBSTR(UPPER(REPLACE(REPLACE(r.stationid, ':', ''), '-', '')),1, 12))) as qty_uniq_aps,
count(*) AS qtd_of_sessions
FROM example.tableexample_parquet r
WHERE r.dt >= from_iso8601_date(CONCAT(CAST(extract(year FROM current_date) AS varchar(4)),
'-',
CAST(extract(month FROM current_date) AS varchar(2)),
'-01'
))
GROUP BY 1
ORDER BY 1;
正在查看:
WHERE r.dt >= from_iso8601_date(CONCAT(CAST(extract(year FROM current_date) AS varchar(4)),
'-',
CAST(extract(month FROM current_date) AS varchar(2)),
'-01'
))
这是一个示例:此代码将采用 actual_year-actual_month-first_day_of_month 的间隔,如下所示:
2020-07-01 >= the newest registry in database
我真的很想让它变得聪明。我想在带有 Between 的 Where 子句中转换它,如下所示:
WHERE r.dt BETWEEN actual_year-last_month-first_day_of_month AND actual_year-last_month-last_day_of_month
问题是: A) 月份的最后一天会随月份而变化(例如,有些月份有 30 天,有些月份有 31 天,还有一些月份有 28 或 29 天)。 B) 我在这个 link https://prestosql.io/docs/current/functions/datetime.html 中找到了一个名为 last_day_of_month(x) 的函数,但在 Athena 上不起作用。
我想问你一些关于如何解决这个问题的想法。我在 PrestoDB 文档中搜索了与日期和时间相关的函数,但我不知道如何在没有 last_day_of_month(x) 的情况下实现这一点。 即使有了这个答案,我也可以将 where 子句与 r.dt >= the first day of last month 一起使用,并在每月的第一天对 QuickSight 进行 运行 查询。但我正在寻找一个解耦的解决方案。谢谢!
如果真的要查询整个月份,只需要比较年月就可以了(根本不需要知道天数),所以应该比较年月的“字符串”,并且确定月份总是两位数(例如 07
)。这将完成工作:
WHERE date_format ( r.dt, '%Y-%m' ) = date_format ( current_date, '%Y-%m' )
如果你想运行上个月的查询,但你现在已经在新的月份,你应该从当前时间减去一些天数以获得上个月(如果你在一年的最后一个月..).
所以 current_date
写成:
date_add('day', -7, current_date)