【问题标题】:array_agg group by and nullarray_agg group by 和 null
【发布时间】:2014-03-16 22:23:57
【问题描述】:

鉴于此表:

SELECT * FROM CommodityPricing order by dateField

"SILVER";60.45;"2002-01-01"
"GOLD";130.45;"2002-01-01"
"COPPER";96.45;"2002-01-01"
"SILVER";70.45;"2003-01-01"
"GOLD";140.45;"2003-01-01"
"COPPER";99.45;"2003-01-01"
"GOLD";150.45;"2004-01-01"
"MERCURY";60;"2004-01-01"
"SILVER";80.45;"2004-01-01"

自 2004 年起,铜被淘汰,汞被引入。
如何将(array_agg(value order by date desc) ) [1] 的值作为NULL 获取COPPER 的值?

select commodity,(array_agg(value order by date desc) ) --[1]
from CommodityPricing
group by commodity

"COPPER";"{99.45,96.45}"
"GOLD";"{150.45,140.45,130.45}"
"MERCURY";"{60}"
"SILVER";"{80.45,70.45,60.45}"

【问题讨论】:

标签: postgresql null group-by left-join generate-series


【解决方案1】:

SQL Fiddle

select
    commodity,
    array_agg(
        case when commodity = 'COPPER' then null else price end
        order by date desc
    )
from CommodityPricing
group by commodity
;

【讨论】:

    【解决方案2】:

    要在结果数组中用 NULL 值“填充”缺失的行,请在 行的完整网格LEFT JOIN 网格的实际值上构建查询。 鉴于此表定义:

    CREATE TEMP TABLE price (
        commodity text
      , value     numeric
      , ts        timestamp  -- using ts instead of the inappropriate name date 
    );
    

    我使用generate_series() 获取代表年份的时间戳列表,并使用CROSS JOIN 获取所有商品的唯一列表 (SELECT DISTINCT ...)。

    SELECT commodity, (array_agg(value ORDER BY ts DESC)) AS years
    FROM   generate_series ('2002-01-01 00:00:00'::timestamp
                          , '2004-01-01 00:00:00'::timestamp
                          , '1y') t(ts)
    CROSS  JOIN (SELECT DISTINCT commodity FROM price) c(commodity)
    LEFT   JOIN price p USING (ts, commodity)
    GROUP  BY commodity;
    

    结果:

    COPPER  {NULL,99.45,96.45}
    GOLD    {150.45,140.45,130.45}
    MERCURY {60,NULL,NULL}
    SILVER  {80.45,70.45,60.45}
    

    SQL Fiddle.
    我将数组转换为小提琴中的文本,因为显示器很糟糕,否则会吞下 NULL 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多