【问题标题】:How to determine number of days in a month in Presto?如何确定 Presto 中一个月的天数?
【发布时间】:2020-01-12 01:05:21
【问题描述】:

我有日期、用户 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

目前我使用 case when 来解决这个问题。有什么更好的方法吗?

【问题讨论】:

标签: sql presto


【解决方案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)) 给出下月初
  • 减去date 值返回interval day to second
  • EXTRACT(DAY FROM interval) 返回时间间隔的天部分。您也可以使用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)

【讨论】:

  • @muhnandap 我找到了一个更短的替代方案并更新了答案。
猜你喜欢
  • 2010-10-16
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
相关资源
最近更新 更多