如何在 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)