【问题标题】:How to show sum per day AND year postgresql如何显示每天和每年的总和 postgresql
【发布时间】:2018-08-29 16:46:05
【问题描述】:

我想获取每天和每年的总和行值,并显示在同一行。

第一个和第二个查询从中获取结果的数据库包括这样的表(ltg_data):

time                      lon         lat                geom
2018-01-30 11:20:21       -105.4333     32.3444          01010....

然后是我要加入的一些几何图形。

一个查询:

SELECT to_char(time, 'MM/DD/YYYY') as day, count(*) as strikes FROM County JOIN ltg_data on ST_contains(counties.the_geom, ltg_data.ltg_geom) WHERE cwa = 'MFR' and time >= (now() at time zone 'utc') - interval '50500 hours' group by 1;

结果如下:

day              strikes
01/28/2018       22
03/23/2018       15
12/19/2017       20
12/20/2017       12

第二次查询:

SELECT to_char(time, 'YYYY') as year, count(*) as strikes FROMcounties JOIN ltg_data on ST_contains(counties.the_geom, ltg_data.ltg_geom) WHERE cwa = 'MFR' and time >= (now() at time zone 'utc') - interval '50500 hours' group by 1;

结果如下:

year            strikes
2017            32
2018            37

我想要的是:

day             daily_strikes       year          yearly_strikes
01/28/2018      22                  2018          37
03/23/2018      15                  2018          37
12/19/2017      20                  2017          32
12/20/2017      12                  2017          32

我发现 union all 在最底部显示年度总计,但我希望横向显示结果,即使有重复的年度总计。感谢您的帮助!

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    您可以尝试这种方法。这不是非常理想,但至少可以工作:

    我有一个这样的测试表:

    postgres=# select * from test; d | v ------------+--- 2001-02-16 |一种 2002-02-16 |一种 2002-02-17 |一种 2002-02-17 |一种 (4 维尔斯)

    并查询:

    select
        q.year,
        sum(q.countPerDay) over (partition by extract(year from q.day)), 
        q.day, 
        q.countPerDay 
    from (
        select extract('year' from d) as year, date_trunc('day', d) as day, count(*) as countPerDay from test group by day, year
    ) as q
    

    所以结果是这样的:

    2001 | 1 | 2001-02-16 00:00:001 | 1 2002 | 3 | 2002-02-16 00:00:001 | 1 2002 | 3 | 2002-02-17 00:00:001 | 2

    【讨论】:

      【解决方案2】:
      create table strikes (game_date date,
                            strikes int
                           ) ;
      
      
      insert into strikes (game_date, strikes)
      values ('01/28/2018', 22),
       ('03/23/2018', 15),
       ('12/19/2017', 20),
       ('12/20/2017', 12)
       ;
      
      
      select * from strikes ;
      
      
      select game_date, strikes, sum(strikes) over(partition by extract(year from game_date) ) as sum_stikes_by_year
      from strikes ;
      
      "2017-12-19"    20  "32"
      "2017-12-20"    12  "32"
      "2018-01-28"    22  "37"
      "2018-03-23"    15  "37"
      

      这种聚合应用称为“加窗”函数或分析函数: PostgreSQL Docs

      ---- EDIT --- based on comments...
      
      create table strikes_tally (strike_time timestamp,
                                lat varchar(10),
                                long varchar(10),
                                geom varchar(10)
                           ) ;
      
      
      insert into strikes_tally (strike_time, lat, long, geom)
      values ('2018-01-01 12:43:00', '100.1', '50.8', '1234'),
             ('2018-01-01 12:44:00', '100.1', '50.8', '1234'),
             ('2018-01-01 12:45:00', '100.1', '50.8', '1234'),
             ('2018-01-02 20:01:00', '100.1', '50.8', '1234'),
             ('2018-01-02 20:02:00', '100.1', '50.8', '1234'),
             ('2018-01-02 22:03:00', '100.1', '50.8', '1234') ;
      
      select to_char(strike_time, 'dd/mm/yyyy') as strike_date,
              count(strike_time) over(partition by to_char(strike_time, 'dd/mm/yyyy')) as daily_strikes,
              to_char(strike_time, 'yyyy') as year,
              count(strike_time) over(partition by to_char(strike_time, 'yyyy') ) as yearly_strikes
      from strikes_tally 
       ;
      

      【讨论】:

      • Victor,我在我的问题中添加了更多细节,包括第一个和第二个查询所依据的表。所以没有“每日罢工”表。罢工次数是从初始查询中得出的。我只是想弄清楚如何从一个查询中获得每日和每年的罢工。”希望这是有道理的。谢谢!
      • 另外,我一直在查看“窗口”并在结果中不断得到小数点和愚蠢的数字,而它应该是整数。当然我用错了,但只是不确定我做错了什么。
      • 要显示年份,即使这意味着它重复,使用:选择游戏日期,罢工作为daily_strikes,extract(year from game_date)作为年份,sum(strikes) over(partition by extract(year from game_date) ) 作为 sum_stikes_by_year 从罢工;
      • 维克多,澄清一下,没有“罢工”表。我有一个包含所有罢工数据的表格,如我的问题顶部所示。然后我有一个县表,我正在使用 PostGIS 加入罢工纬度/经度数据。从这两个表中,我可以很容易地获得每天罢工的总和......以及每年的罢工总和......但在不同的查询中。我试图弄清楚如何组合查询,但将结果放在水平行中,而不是“联合所有”给我的结果。你是说我需要创建一个全新的表并填充初始查询的结果吗?看起来很复杂。
      • 我有点困惑,因为您想要的结果集根本不显示地理数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 2021-09-29
      • 2017-11-14
      • 2016-02-27
      • 2012-12-12
      • 1970-01-01
      • 2018-06-17
      相关资源
      最近更新 更多