【问题标题】:Using average in query (PostgreSQL)在查询中使用平均值 (PostgreSQL)
【发布时间】:2013-03-18 20:17:12
【问题描述】:

我无法通过以下架构查询每个巴士公司使用的巴士的平均年龄:

巴士公司

company_id | name
 1           NED
 2           JIM

总线类型

type_id | date_made
 1        2006-01-26
 2        1999-05-05
 3        2000-09-01

路线

route_id | bustype | bus_company
 1         2         1
 2         1         1
 3         1         1
 4         3         2
 5         3         2
 6         1         2
 7         2         2

在此示例中,假设今天是 2013 年 3 月 18 日,NED 的平均巴士车龄为 4246.666 = 4247 天。

整个查询会是什么样子?

【问题讨论】:

    标签: postgresql average


    【解决方案1】:

    我现在无法测试,但类似:

    -- assuming "date_made" is a pg DATE column
    --
       SELECT buscompany.name, ROUND(AVG(CURRENT_DATE - date_made))
         FROM buscompany
    LEFT JOIN route
              ON route.bus_company = buscompany.company_id
    LEFT JOIN bustype
              ON route.bustype = bustype.type_id
     GROUP BY 1
    

    应该做你想做的(tm)。 pg 中的日期减法给出了天数的差异。

    【讨论】:

    • @HalfFrench,怎么样?再说一次,现在不能与现场 pg 比赛。
    • 是的,行得通。你做了这么简单的查询。我总是把我的复杂化,我仍然把它们弄错了。干杯。
    【解决方案2】:

    以下(基于我制作的示例表)给出了平均天数。

    select extract(day from avg(current_date-birthday)) from stuff;
    

    avg 给你一个间隔而不是天数,所以我做了提取。

    如果您想要处理间隔而不是天数,那么您可以这样做

    select avg(age(birthday)) from stuff;
    

    【讨论】:

    • "birthday" 必须是stuff 的时间戳类型;将其强制为日期类型,您将使用整数而不是间隔。
    • 已验证如果列是日期类型,则第一个语句不需要提取语句。由于age 函数,第二个仍然返回一个间隔。感谢您指出这一点。 sqlfiddle.com/#!12/2f53c/2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多