Sql 是否有一个窗口函数来计算普雷斯托过去90天内每个商户的平均支出?

Sql 是否有一个窗口函数来计算普雷斯托过去90天内每个商户的平均支出?,sql,presto,amazon-athena,Sql,Presto,Amazon Athena,我想计算过去90天每个商户的平均消费。 我一直在用pyspark SQL来实现这一点: df_spark=df_spark.with列(“t_unix”,F.unix_时间戳(df_spark['date'])) windowSpec=Window.orderBy(“t_unix”).partitionBy(“商户”).rangeBetween(-3*30*24*3600,-1) 平均支出=F.avg(df_spark['amount'])。超过(windowSpec) df=df_spark.

我想计算过去90天每个商户的平均消费。 我一直在用pyspark SQL来实现这一点:

df_spark=df_spark.with列(“t_unix”,F.unix_时间戳(df_spark['date']))
windowSpec=Window.orderBy(“t_unix”).partitionBy(“商户”).rangeBetween(-3*30*24*3600,-1)
平均支出=F.avg(df_spark['amount'])。超过(windowSpec)
df=df_spark.with列(“平均支出”,平均支出)
df.选择(“商户”、“日期”、“金额”、“平均支出”)。显示(5)
+---------+-------------------+-------+----------------+
|商户|日期|金额|平均|支出|
+---------+-------------------+-------+----------------+
|26 | 2017-01-01 01:11:06 | 3 |空|
| 26      |2017-01-01 02:02:15| 54    |             3.0|
| 26      |2017-01-01 02:26:45|  6    |            28.5|
| 26      |2017-01-01 02:40:37|  4    |            21.0|
| 26      |2017-01-01 02:41:51| 85    |           16.75|
+---------+-------------------+-------+----------------+
仅显示前5行
现在我想在AWS雅典娜(普雷斯托)上做这件事

我尝试了以下查询:

但我得到了错误信息:

Your query has the following error(s):

SYNTAX_ERROR: line 7:24: Unexpected parameters (varchar(3), integer, varchar) for function date_add. Expected: date_add(varchar(x), bigint, date) , date_add(varchar(x), bigint, time) , date_add(varchar(x), bigint, time with time zone) , date_add(varchar(x), bigint, timestamp) , date_add(varchar(x), bigint, timestamp with time zone)
Your query has the following error(s):

SYNTAX_ERROR: line 7:24: Unexpected parameters (varchar(3), integer, varchar) for function date_add. Expected: date_add(varchar(x), bigint, date) , date_add(varchar(x), bigint, time) , date_add(varchar(x), bigint, time with time zone) , date_add(varchar(x), bigint, timestamp) , date_add(varchar(x), bigint, timestamp with time zone)
SYNTAX_ERROR: line 5:4: Window frame start value type must be INTEGER or BIGINT(actual interval day to second)
但是在date_add('day',-90,“date”)中,我希望“date”作为行的当前时间戳,而不是静态时间戳

选择
“日期”,
“商人”,
“金额”,
平均值(“金额”)
从“表”
其中(“日期”介于日期加上(“日期”、-90、“日期”)和“日期”之间)
按“商户”分组
按“日期”订购
限制5
但我得到了错误信息:

Your query has the following error(s):

SYNTAX_ERROR: line 7:24: Unexpected parameters (varchar(3), integer, varchar) for function date_add. Expected: date_add(varchar(x), bigint, date) , date_add(varchar(x), bigint, time) , date_add(varchar(x), bigint, time with time zone) , date_add(varchar(x), bigint, timestamp) , date_add(varchar(x), bigint, timestamp with time zone)
Your query has the following error(s):

SYNTAX_ERROR: line 7:24: Unexpected parameters (varchar(3), integer, varchar) for function date_add. Expected: date_add(varchar(x), bigint, date) , date_add(varchar(x), bigint, time) , date_add(varchar(x), bigint, time with time zone) , date_add(varchar(x), bigint, timestamp) , date_add(varchar(x), bigint, timestamp with time zone)
SYNTAX_ERROR: line 5:4: Window frame start value type must be INTEGER or BIGINT(actual interval day to second)
但是在date\u add('day',-90,“date”)中,我希望“date”作为行的当前时间戳,而不是静态时间戳

我做了另一次尝试:

选择
unix_日期,
商人
数量
平均(金额)
结束
(按商户划分)
按日期订购
前一行间隔“90”天和当前行之间的范围
)平均
从…起
但我得到了错误信息:

Your query has the following error(s):

SYNTAX_ERROR: line 7:24: Unexpected parameters (varchar(3), integer, varchar) for function date_add. Expected: date_add(varchar(x), bigint, date) , date_add(varchar(x), bigint, time) , date_add(varchar(x), bigint, time with time zone) , date_add(varchar(x), bigint, timestamp) , date_add(varchar(x), bigint, timestamp with time zone)
Your query has the following error(s):

SYNTAX_ERROR: line 7:24: Unexpected parameters (varchar(3), integer, varchar) for function date_add. Expected: date_add(varchar(x), bigint, date) , date_add(varchar(x), bigint, time) , date_add(varchar(x), bigint, time with time zone) , date_add(varchar(x), bigint, timestamp) , date_add(varchar(x), bigint, timestamp with time zone)
SYNTAX_ERROR: line 5:4: Window frame start value type must be INTEGER or BIGINT(actual interval day to second)
这里还有一个类似的未解决问题:

如果每个商户×日期有一个数据点,可以使用

如果每个商户和日期的数据点数量不同,则可以执行以下操作:

SELECT
  c.merchant, c.date, c.amount, avg(preceding.amount)
  FROM your_table c
  JOIN your_table preceding ON c.merchant = preceding.merchant
    AND preceding.date BETWEEN (c.date - INTERVAL '89' DAY) AND c.date
  GROUP BY c.merchant, c.date, c.amount

这对我来说很有效

CREATE TABLE IF NOT EXISTS full\u year\u query\u parquet
使用(格式=‘拼花’,
拼花地板的压缩量='SNAPPY',
外部_location='s3://您的_s3_bucket/data')作为
选择
a、 商人,
a、 金额,
a、 日期,
平均值(先前的金额)
从“你的桌子”作为
在a.merchant=previous.merchant上加入“您的_表”,如前所述
和previous.date>date_ADD('day',-90,a.date)
和之前的日期<日期
按a.商户、a.金额、a.日期分组

您所说的“行的当前时间戳”是什么意思?从unixtime查看
函数()。这有帮助吗?我试图找到一个函数,我可以在任何时间点计算过去90天的平均花费。过去90天的循环/滚动平均值,但当我使用上述值时,我得到一个错误。例如,如果我有一个一年中所有天数的列表,我需要计算每一天最后90天的平均值。你有每个商户和每一天的数据点吗,还是很稀疏?
date
列的类型是什么?@PiotrFindeisen是每个商户和日期的数据点,日期列的类型是stringYes,但这不是我想要的。我不想要89行,而是89天。我尝试了
范围介于
之间,但我得到了错误窗口,前面的帧范围仅支持无界:因为每个商户和日期都有一个数据点,所以前面的89行与前面的89行相同。糟糕的是,每个商户每天都有几笔交易。因此,我可以在同一天有多行,因此前面的89行与前面的89行不同。我在上面放了一个表格示例。Presto不支持有界范围框架——与行框架()相反。如果您每天有未指定数量的数据点,我将使用带不等式过滤器的自连接(我用建议的方法扩展了我的答案)