【问题标题】:SQL: average by monthSQL:按月平均
【发布时间】:2017-05-12 12:56:41
【问题描述】:

我想计算具有每日数据的变量的每个场所的月平均值。我的日期变量具有数字格式“YYYYMMDD”。 我的数据如下所示:

date        venue   metric
20150203    1       0.78
20150204    1       0.65
20150205    1       0.90
20150206    1       0.40
20150203    2       0.74
20150204    2       0.77
20150205    2       0.88
20150206    2       0.64
20150203    3       0.78
20150204    3       0.92
20150205    3       0.94
20150206    3       0.60

【问题讨论】:

  • 哪种数据库类型?
  • 将您的日期从数字转换为 varchar(8)...日期函数在我的情况下应该能够很好地识别年份...否则应用文化/区域
  • 将日期存储为适当的date 类型,而不是数字。

标签: sql postgresql


【解决方案1】:

无论数据库如何,您都应该将日期存储为 dates 而不是 numbers。在任何情况下,类似以下的内容都应该适用于任何数据库:

select floor(date / 100) as yyyymm, venue, avg(metric)
from t
group by floor(date / 100), venue;

【讨论】:

    【解决方案2】:

    假设您使用的是 PostgreSQL:

    SELECT
        month,
        venue,
        AVG(metric)
    FROM (
        SELECT 
            EXTRACT(MONTH FROM TO_DATE(CAST(your_date_field AS TEXT), 'YYYYMMDD')) AS month, venue, metric
        FROM 
            your_table
        ) AS sub
    GROUP BY
        month, venue;
    

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT SUBSTRING(DATE, 5,2) AS MONTH, VENUE, AVG (METRIC)
      FROM TABLENAME
      GROUP BY SUBSTRING(DATE, 5,2), VENUE
      

      另外,我同意这里的每个人都应该将日期存储为日期值。

      【讨论】:

      • 是的,很抱歉它被保存为日期。我对 SQL 很陌生。无论如何,我试过“选择年(日期),月(日期),公制......”但得到一个错误:“错误:函数年(日期)不存在第1行:选择年(日期)作为年, month(date) as month, market_id, ... ^ 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。**********错误**** ******"
      • 查看stackoverflow.com/questions/36869703/…,看看这是否有助于您从日期字段中提取月份。
      猜你喜欢
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      相关资源
      最近更新 更多