Sql 如何在雅典娜(普雷斯托)以每月一次的间隔工作?

Sql 如何在雅典娜(普雷斯托)以每月一次的间隔工作?,sql,business-intelligence,presto,amazon-athena,amazon-quicksight,Sql,Business Intelligence,Presto,Amazon Athena,Amazon Quicksight,我正在开发一个将在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(SUBST

我正在开发一个将在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'
    ))
这是一个示例:此代码将以实际年-实际月-月的第一天为间隔,如下所示:

WHERE r.dt BETWEEN actual_year-last_month-first_day_of_month AND actual_year-last_month-last_day_of_month
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)的函数,但它在Athena上不起作用

我想问你一些关于如何解决这个问题的想法。我在PrestoDB文档中搜索了与日期和时间相关的函数,但如果没有月的最后一天(x),我不知道如何实现这一点。
即使有了这个答案,我也可以使用带有r.dt>=上月第一天的where子句,并在每月第一天运行QuickSight查询。但我正在寻找一个解耦的解决方案。谢谢

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

WHERE date_format ( r.dt, '%Y-%m' ) = date_format ( current_date, '%Y-%m' )
如果您希望在上个月运行查询,但您现在已经在新的月份中,那么您应该从当前时间中减去一些天来获得上个月(如果您在一年的最后一个月,则可能是一年…)

因此,与其写下当前日期,不如写下:

date_add('day', -7, current_date) 

根据您的建议:其中date\u格式(r.dt,'%Y-%m')=date\u格式(date\u add('day',-7,current\u date),'%Y-%m')工作得非常好!非常感谢你!!