首页 > 解决方案 > 在 Postgresql 中对每月结果的多个日期进行分组

问题描述

我在 Postgres 服务器上有下表,该表始终使用新日期进行更新(最早的日期是 3 年前),但为了简单起见,我们只显示 3 条记录:

id      date1         date2        date3 
1245    01/04/2018    05/04/2018   03/05/2018   
1255    01/04/2018    01/06/2018   04/06/2018 
1231    03/05/2018    07/05/2018   07/06/2018
1234    01/04/2017    01/04/2017   01/06/2018

我想创建一个 sql 视图,该视图将为我提供每种日期类型的总单位数

month     date1 date2 date3    
Jun       0     1     3   
May       1     1     1 
Apr       2     1     0
Apr17     1     1     0

有没有一种简单的方法可以做到这一点?到目前为止,我的 sql 看起来像

CREATE OR REPLACE VIEW monthly_view 
AS
SELECT row_number() OVER (ORDER BY b.id) AS id,
       'month',
       count(*) as date1,
       count(*) as date2,
       count(*) as date3
FROM mytable b
GROUP BY month
ORDER BY month desc

但显然行不通

标签: sqlpostgresql

解决方案


经测试!

Luffydude,你想做坏事,但那是解决方案;)

    --所有月份
    allmonths 为 (
        从 tmp_a 中选择 to_char(date1, 'TMmon') as mm
        联盟
        从 tmp_a 中选择 to_char(date2, 'TMmon') as mm
        联盟
        从 tmp_a 中选择 to_char(date3, 'TMmon') as mm
    ),
    --count_in_date1
    count_in_date1 为 (
        选择
            t1.mm,
            count(t2.date1) as count_in_date1
        从
            allmonths t1 left join tmp_a t2
                在 to_char(t2.date1, 'TMmon') = t1.mm
        通过...分组
            t1.mm
    ),
    --count_in_date2
    count_in_date2 为 (
        选择
            t1.mm,
            计数(t2.date2)作为count_in_date2
        从
            allmonths t1 left join tmp_a t2
                在 to_char(t2.date2, 'TMmon') = t1.mm
        通过...分组
            t1.mm
    ),
    --count_in_date3
    count_in_date3 为 (
        选择
            t1.mm,
            计数(t2.date3)作为count_in_date3
        从
            allmonths t1 left join tmp_a t2
                在 to_char(t2.date3, 'TMmon') = t1.mm
        通过...分组
            t1.mm
    )
    --join所有计数一起
    选择 t1.mm、count_in_date1、count_in_date2、count_in_date3
    从 count_in_date1 t1、count_in_date2 t2、count_in_date3 t3
        其中 t1.mm=t2.mm 和 t1.mm=t3.mm

推荐阅读