【问题标题】:Postgres return multiple identical results based on the number of yearsPostgres 根据年数返回多个相同的结果
【发布时间】:2013-10-13 15:41:36
【问题描述】:

我有一个包含子查询的 Postgres 查询,只输出 12 行数据,这正是我想要的样子。这些行中的每一行代表数据库中所有年份的数据的月平均值,每个月一行。 查询:

SELECT
  to_char(to_timestamp(to_char(subquery2.month, '999'), 'MM'), 'Mon') AS Month,
  subquery2.month AS Month_num,
  round(AVG(subquery2.all_use_tot), 2) AS Average_Withdrawals,
  round(AVG(subquery2.all_cu_tot), 2) AS Average_Consumptive_Use
FROM
(SELECT
  subquery1.month,
  subquery1.year,
  sum(subquery1.liv_tot) AS all_use_tot,
  sum(subquery1.CU_total) AS all_cu_tot
FROM
    (SELECT 
        EXTRACT('Month' FROM withdrawals.begintime) AS month,
        EXTRACT(YEAR FROM withdrawals.begintime)::int AS year,
        tdx_ic_use_type.use_type_code AS Use_type,
        sum(withdrawals.withdrawalvalue_mgd) AS liv_tot,
        (tdx_ic_use_type.cufactor)*(sum(withdrawals.withdrawalvalue_mgd)) AS CU_total
    FROM 
        medford.tdx_ic_use_type,
        medford.withdrawalsites
        JOIN medford.subshed2 ON ST_Contains(medford.subshed2.the_geom, medford.withdrawalsites.the_geom)
        JOIN medford.withdrawals ON medford.withdrawals.ic_site_id = medford.withdrawalsites.ic_site_id
    WHERE 
        subshed2.id = '${param.shed_id}' AND
        withdrawalsites.ic_pr_use_type_id = tdx_ic_use_type.use_type_code AND
        withdrawals.intervalcodes_id = 2

    GROUP BY
        year, 
        extract('Month' from withdrawals.begintime),
        tdx_ic_use_type.cufactor,
        Use_type
    ORDER BY
        year, extract('Month' from withdrawals.begintime) ASC
        ) AS subquery1
GROUP BY
  subquery1.year,
  subquery1.month
  ) AS subquery2
GROUP BY
  subquery2.month
ORDER BY
  subquery2.month

输出的样子:

"Jan"  1  1426.50  472.65
"Feb"  2  1449.00  482.10
"Mar"  3  1459.50  485.55
"Apr"  4  1470.00  489.00
"May"  5  1480.50  492.45
"Jun"  6  1491.00  495.90
"Jul"  7  1489.50  493.35
"Aug"  8  1512.00  502.80
"Sep"  9  1510.50  500.25
"Oct" 10  1533.00  509.70
"Nov" 11  1543.50  513.15
"Dec" 12  1542.00  510.60

我从数据库中的日期时间列中提取的月份列。我正在使用此查询的结果并将其存储在一个数组中,但我想为表中存在的每一年重复一次这些确切的结果。因此,如果数据库中有 2 年的数据,则应该有 24 个输出行,或者,12 个相同的行重复两次。如果数据库中有 3 年的数据,则应该有 36 个输出行,或者 12 个相同的行重复 3 次。 如何在查询中完成此操作?有没有办法根据列中的值循环查询(即日期时间字段中存在的年数?)

【问题讨论】:

    标签: postgresql date data-generation


    【解决方案1】:

    您应该在查询中将group by month 更改为group by year, month。 (但这只会在给定月份有数据的情况下为您提供结果。)

    对于几个月的迭代:

    select a::date
    from generate_series(
        '2011-06-01'::date,
        '2012-06-01',
        '1 month'
    ) s(a)
    

    (基于此:Writing a function in SQL to loop through a date range in a UDF

    【讨论】:

    • 感谢您的想法。我已经用实际查询更新了我的问题。我以几种不同的方式尝试了您的建议,但是不同年份的值会发生变化,因此相同的 12 个月数据集不会重复,而是在变化。有没有办法根据列中的值循环查询?
    • 我添加了一个示例来生成月份。你应该加入这个结果集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 2017-11-03
    相关资源
    最近更新 更多