代码之家  ›  专栏  ›  技术社区  ›  Hayate

数组_AGG()按另一列的值分组

  •  0
  • Hayate  · 技术社区  · 2 年前

    下面是我的桌子

    p_no  type  name  value
    ------------------------
    1     A     Tomy  1
    1     A     Nick  2
    1     B     Tomy  3
    1     B     Nick  4
    1     C     Tomy  5
    1     C     Nick  4
    2     A     Tomy  8
    2     A     Nick  7
    2     B     Tomy  5
    2     B     Nick  4
    

    意思是每个人 p_no 表示一个块,该块记录了Pople在这两个方面的值 A, B, C 类型(可能是更多类型)。

    我想选择一个对所有类型都有价值的人

    鉴于 p_no=1, name=Tomy

    A    B    C    D
    ------------------
    1    3    5    ..
    

    我试过了

    SELECT p_no, t[1] A, t[2] B/*, t[3] C.....*/
    FROM (
        SELECT p_no, ARRAY_AGG(type) FILTER (WHERE name='Tomy') t
        FROM type
        GROUP BY 1
        ORDER BY 1) _unused
    

    但它不能使数组_AGG()包含该值

    我想我需要类似的东西 ARRAY_AGG('value' GROUP BY 'type')

    这种查询可能吗?或者有更好的替代方案吗?

    1 回复  |  直到 2 年前
        1
  •  1
  •   klin    2 年前

    你的直觉是对的。你想要聚合吗 value 订购人 type ,所以:

    select p_no, t[1] as "A", t[2] as "B", t[3] as "C"
    from (
        select p_no, array_agg(value order by type) as t
        from my_table
        where name = 'Tomy' 
        group by p_no
        ) s
    

    db<>fiddle.