如何在雅典娜(presto)中以每月一次的间隔工作?

7vhp5slm  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(287)

我正在开发一个将在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'
    ))

这是一个示例:此代码将采用实际年-实际月-月的第一天的间隔,如下所示:
2020-07-01>=数据库中最新的注册表
我真的很想让它变聪明。我想把它转换成where子句中的between,比如:

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) 我在这个链接中找到了一个名为last\ day\ of\ month(x)的函数https://prestosql.io/docs/current/functions/datetime.html 但不是在为雅典娜工作。
我想问你一些关于如何解决这个问题的想法。我在prestodb docs中搜索了与日期和时间相关的函数,但我不知道如何在没有月的最后一天(x)的情况下实现这一点。即使有了这个答案,我也可以使用带有r.dt>=the first day of last month的where子句,并在每月的第一天运行quicksight查询。但我正在寻找一个解耦的解决方案。谢谢!

b4qexyjb

b4qexyjb1#

如果你真的想查询整个月,你只需要比较年和月(根本不需要知道天),所以你应该比较年和月的“字符串”,并且确保月总是两位数(例如。 07 ). 这将完成以下工作:

WHERE date_format ( r.dt, '%Y-%m' ) = date_format ( current_date, '%Y-%m' )

如果您想在上个月运行查询,但您现在已经在新的月份中,您应该从当前时间中减去一些天来获得上个月(如果您在一年的最后一个月,则可能是一年…)。
所以 current_date 写:

date_add('day', -7, current_date)

相关问题