如何确定 Presto 一个月中的天数?

How to determine number of days in a month in Presto?

我有日期、用户 ID 和金额的数据。我想计算总和(金额)除以每个月的总天数。决赛将按月进行。

我的table是这样的

date       userid  amount
2019-01-01  111  10
2019-01-15  112  20
2019-01-20  113  10
2019-02-01  114  30
2019-02-15  111  20
2019-03-01  115  40
2019-03-23  155  50

想要的结果是这样的

date    avg_qty_sol
Jan-19  1.29
Feb-19  1.79
Mar-19  2.90

avg_qty_sold 来自相应月份的总和(金额)/总天数 例如,2019 年 1 月的总金额为 40,1 月的总天数为 31。因此 avg_qty_sold 为 40/31

目前我正在使用此解决方案的案例。有什么更好的方法吗?

从 Presto 318 开始,你这就像:

SELECT day(last_day_of_month(some_date))

https://trino.io/docs/current/functions/datetime.html#last_day_of_month

在 Presto 318 之前,您可以组合 date_trunc with EXTRACT:

  • date_trunc('month', date_value))给出月初,而date_add('month', 1, date_trunc('month', date_value))给出下个月的月初
  • 减去 date 值 returns 和 interval day to second
  • EXTRACT(DAY FROM interval) returns 间隔的天数部分。您还可以使用 day 便利函数代替 EXTRACT(DAY FROM ...)EXTRACT 语法更冗长也更标准。
presto:default> SELECT
             ->     date_value,
             ->     EXTRACT(DAY FROM (
             ->         date_add('month', 1, date_trunc('month', date_value)) - date_trunc('month', date_value)))
             -> FROM (VALUES DATE '2019-01-15', DATE '2019-02-01') t(date_value);
 date_value | _col1
------------+-------
 2019-01-15 |    31
 2019-02-01 |    28
(2 rows)

不太自然,但更短的替代方法是使用 day(date_add('day', -1, date_add('month', 1, date_trunc('month', date_value)))):

获取给定月份最后一天的日期编号
presto:default> SELECT
             ->     date_value,
             ->     day(date_add('day', -1, date_add('month', 1, date_trunc('month', date_value))))
             -> FROM (VALUES DATE '2019-01-15', DATE '2019-02-01') t(date_value);
 date_value | _col1
------------+-------
 2019-01-15 |    31
 2019-02-01 |    28
(2 rows)