【问题标题】:COUNT and GROUP BY over time随着时间的推移 COUNT 和 GROUP BY
【发布时间】:2011-10-15 11:06:45
【问题描述】:

我需要在 PostgreSQL 中按天、周、月等创建销售报告。我有以下表格设置:

tbl_products:
    id INT
    name VARCHAR

tbl_purchase_order:
    id INT
    order_timestamp TIMESTAMP

tbl_purchase_order_items:
    id INT
    product_id INT (FK to tbl_products.id)
    order_id (FK to tbl_purchase_order.id)

我需要创建一个 SQL 查询,该查询返回给定产品在给定时间范围内的购买次数。也就是说,我需要查询给定产品 ID 在特定月份、日期、年份等中出现在采购订单项目中的次数。在较早的问题中,我学习了如何使用 date_trunc() 将我的 TIMESTAMP 列截断为我关心的时间段。现在我面临如何正确执行 COUNT 和 GROUP BY 的问题。

我使用 COUNT(XXX) 和 GROUP BY XXX 的各种组合尝试了几个查询,但似乎从来没有想出我期望的结果。有人可以指导我如何构建此查询吗?我更像是一名 Java 开发人员,所以我仍在加快 SQL 查询的速度。感谢您提供的任何帮助。

【问题讨论】:

    标签: sql postgresql count group-by


    【解决方案1】:

    每年计数:

    SELECT oi.product_id, 
           extract(year from po.order_timestamp) as order_year
           count(*)
    FROM purchase_order_items oi
       JOIN purchase_order po ON po.id = oi.order_id
    GROUP BY extract(year from po.order_timestamp)
    

    每月计数器:

    SELECT oi.product_id, 
           extract(month from po.order_timestamp) as order_month
           extract(year from po.order_timestamp) as order_year
           count(*)
    FROM purchase_order_items oi
       JOIN purchase_order po ON po.id = oi.order_id
    GROUP BY extract(year from po.order_timestamp), 
             extract(month from po.order_timestamp)
    

    【讨论】:

    • 那么为什么要使用 extract() 并分解日期组件,而不是使用 date_trunc() 并以 '2011-06-01' 结尾?这样做有好处吗?行为是否不同?
    • @Shadowman:部分是因为这是我的习惯,部分是因为只获取年份,date_trunc() 无法胜任。
    【解决方案2】:

    查看 postgres 日期时间函数 http://www.postgresql.org/docs/8.1/static/functions-datetime.html

    我建议您使用提取功能,将年、月和日拆分为结果集中的离散列,然后根据您的要求进行分组。

    【讨论】:

    • 我为什么要分开日期组件?为什么我不能使用 date_trunc() 方法来获取我正在寻找的月份或年份?我只是好奇会有什么不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2021-08-01
    • 2014-05-20
    相关资源
    最近更新 更多