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

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

提问人:justnewbie89 提问时间:9/10/2019 最后编辑:Piotr Findeisenjustnewbie89 更新时间:3/7/2021 访问量:4081

问:

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

我的表格是这样的

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

目前我使用此解决方案时的情况。有没有更好的方法?

SQL Presto

评论

0赞 Nkplizz 9/10/2019
我想这篇文章回答了你的问题:stackoverflow.com/questions/691022/......

答:

4赞 Piotr Findeisen 9/10/2019 #1

从 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_truncEXTRACT 结合使用:

  • date_trunc('month', date_value))给出月初,而给出下个月的月初date_add('month', 1, date_trunc('month', date_value))
  • 减去值返回一个dateinterval day to second
  • EXTRACT(DAY FROM interval)返回间隔的天部分。您也可以使用便利功能代替 .语法更详细,更标准。dayEXTRACT(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)

评论

0赞 Piotr Findeisen 9/13/2019
@muhnandap我找到了一个更短的替代方案并更新了答案。