我正在处理一个用例,在这个用例中,我需要在case语句中使用聚合.下面是相同的逻辑

If the column1 matches column2 then data else array_join(array_agg(data), ';')

以下是我的输入数据集-

  column1   column2
      de    decore
      uk    ukcore
      es    escore
      ca    cacore
      es    escore
      uk    ukcore
      ww    a1sz
      ww    a1qu
      ww    a1pp
      ww    a1kv
      ww    a1ba
      ww    a15j
      pl    plcore

以下是我所需的输出

column1 column2
    de  decore
    uk  ukcore
    es  escore
    ca  cacore
    es  escore
    uk  ukcore
    ww  a1sz;a1qu;a1pp;a1kv;a1ba;a15j
    pl  plcore

我try 使用以下查询- Query1

Select column2,
       case
         when trim(lower(split(column2,'xyz')[1])) = trim(lower(column1)) then column2 else array_join(array_agg(column2), ';') end as column2
from my_table
group by column2, column1

Query2

Select column2,
       case
         when trim(lower(column1)) like CONCAT( '%', trim(lower(column2)), '%') then column2 else array_join(array_agg(column2), ';') end as column2
from my_table
group by column2, column1

但它们都没有奏效.请帮帮忙

推荐答案

由于不完全确定实际需要的是什么,只需执行以下操作即可从所提供的样本数据中获得所需的输出:

Select column2,
    array_join(array_agg(data), ';')
from my_table
group by column2;

但如果您想要一些条件逻辑,则需要使用像arbitrary这样的聚合函数从组中 Select 一个值(我使用if而不是case,它基本上是相同的,但使用了更易读的语法):

-- sample data
WITH dataset(column1, column2)     AS (
    values ('de', 'decore'),
        ('uk', 'ukcore'),
        ('es', 'escore'),
        ('ca', 'cacore'),
        ('es', 'escore'),
        ('uk', 'ukcore'),
        ('ww', 'a1sz'),
        ('ww', 'a1qu'),
        ('ww', 'a1pp'),
        ('ww', 'a1kv'),
        ('ww', 'a1ba'),
        ('ww', 'a15j'),
        ('pl', 'plcore')
)

select column1, if(grp_cnd, array_join(array_agg(column2), ';'), arbitrary(column2)) column2
from (
    select *,
       if(
            column2 like trim(column1) || '%', false, true) grp_cnd  
    from dataset)
group by column1, grp_cnd;

输出:

column2 data
usa 5
ww 2;7

UPD

更新以使用新数据(进行较小的重构):

-- sample data
WITH dataset(column1, column2)     AS (
    values ('de', 'decore'),
        ('uk', 'ukcore'),
        ('es', 'escore'),
        ('ca', 'cacore'),
        ('es', 'escore'),
        ('uk', 'ukcore'),
        ('ww', 'a1sz'),
        ('ww', 'a1qu'),
        ('ww', 'a1pp'),
        ('ww', 'a1kv'),
        ('ww', 'a1ba'),
        ('ww', 'a15j'),
        ('pl', 'plcore')
)

-- query
select column1, if(grp_cnd, array_join(array_agg(column2), ';'), arbitrary(column2)) column2
from (
    select *,
       if(
            -- use here appropriate condition
            column2 like trim(column1) || '%', false, true) grp_cnd  
    from dataset)
group by column1, grp_cnd;

输出:

column1 column2
ca cacore
de decore
uk ukcore
es escore
pl plcore
ww a1sz;a1qu;a1pp;a1kv;a1ba;a15j

Sql相关问答推荐

表名数组

如何解决Error:operator is not unique:unknown—unknown在一个动态SQL查询?""""

SQL—如何根据2列填写缺失的值

在请求结束之前,PostgreSQL不会考虑使用中的删除

我可以在SQL的IN子句中使用比子查询包含的值更少的值吗?

返回UPSERT中的旧行值

使用多个嵌套数组查询JSON数据

将结果从一列转换为两行或更多

在UNION查询中查找MIN

在VB.NET中如何在MS Access数据库中创建SQL项目历史库存卡

提取连续时间戳范围的SQL

SQL:如果一个表中的日期在另一个表的日期的12个月内,则为是或否

从每月生成的系列中生成每日汇率

snowflake中的动态文件名生成

批量更改WooCommerce中所有产品的税收状态

根据行号将列转置为没有任何id或键列的行

HIVE SQL where 子句未按预期工作

有条件求和

在 PostgreSQL 中,如何将数组中的每个元素用作另一个表中的键?

Oracle SQL 查询自行运行,但在包装到select count(*) from ()时失败