【问题标题】:Query to get count of distinct items in groupings查询以获取分组中不同项目的计数
【发布时间】:2021-07-10 12:37:30
【问题描述】:

我有一个表,它存储 created 为另一个表中的项目分组,如下所示:

表1

表2

鉴于上述情况,我想编写一个查询,返回 table1 中已为其创建分组的项目数。

这听起来像是在执行以下操作,但实际上这不是我想要的,因为必须手动创建组才能出现在表 2 中,因此您可能有一个来自 table1 的项目在表 2 中不存在表2,因为尚未创建分组(即id:555)。

SELECT count(id)
FROM table1
WHERE group IS NOT NULL

上面将返回 4,但我需要查看 table2 并返回 3,这是 table1 中的项目计数,其组存在于 table2 的类别列中。

我的真实表可能非常大,最多可达 100k+ 行,所以我认为检查表 1 中的组字符串是否存在于表 2 中并不有效,因为这可能需要永远运行 - 或者是这是唯一可行的解​​决方案?

PS:尝试使用表格降价,但我一定搞砸了 PPS 类别列不是 json 类型,它只是字符串

【问题讨论】:

    标签: sql presto trino


    【解决方案1】:

    不确定这是否会更快,但您可以准备现有的类别聚合。类似的东西(你也可以尝试set_union 而不是array_aggflattenarray_distinct):

    SELECT array_distinct(flatten(array_agg(CAST(JSON_EXTRACT(categories, '$.x') as ARRAY(VARCHAR)))))
    FROM table2
    

    并检查group 是否在结果中。

    【讨论】:

      【解决方案2】:

      假设table2 不会在数组中包含table1 中不存在的任何组,您可以尝试以下操作:

      WITH table1(id, "group", qty) AS (
          SELECT *
          FROM (VALUES (111, 'cups', 1),
                       (222, 'plates', 2),
                       (333, 'spoons', 5),
                       (444, null, 2),
                       (555, 'knives', 2))
      ),
           table2(group_id, categories, count_inventory) as (
               SELECT *
               FROM (VALUES ('A1', CAST(MAP(ARRAY['x'], ARRAY[ARRAY['cups', 'plates']]) AS JSON), 3),
                            ('B1', CAST(MAP(ARRAY['x'], ARRAY[ARRAY['cups']]) AS JSON), 1),
                            ('C1', CAST(MAP(ARRAY['x'], ARRAY[ARRAY['cups', 'spoons']]) AS JSON), 6),
                            ('C4', CAST(MAP(ARRAY['x'], ARRAY[ARRAY['spoons']]) AS JSON), 5)
                    ))
      SELECT reduce(
          array_agg(CAST(json_extract(categories, '$.x') AS ARRAY(VARCHAR))),
          array[],
          (s, x) -> array_union(s, x),
          x -> cardinality(x)
          )
      FROM table2 WHERE categories is not null;
      

      【讨论】:

        猜你喜欢
        • 2015-02-07
        • 1970-01-01
        • 2017-07-08
        • 1970-01-01
        • 1970-01-01
        • 2022-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多