【问题标题】:Getting rows with count > 1 without executing two different queries在不执行两个不同查询的情况下获取计数 > 1 的行
【发布时间】:2021-06-17 01:58:38
【问题描述】:

我有一张如下所示的表格:

ITE_ITEM_ID SIT_SITE_ID INVENTORY_ID ITE_VARIATION_ID STOCK_EAN STOCK_FULFILLMENT_ACTIVE
16302514 B WAE6496 62101793519 79098642 1
6210113 M GKVU072 [object Object] NULL 1
16021657 M YHQG635 60513515602 NULL 1
8449326 A ZZRV751 52555136800 NULL 1
1154338160 B VXWP565 NULL NULL 0
559568 M GYPZ201 32325593678 NULL 1
13255753 B PH63355 70388916917 NULL 1
7614543 M XOQO412 51698700618 NULL 1

我正在尝试获取不同的ITE_VARIATION_ID,它们共享相同的STOCK_EAN 并且计数> 1

我目前正在通过拆分两个语句来做到这一点:

create multiset volatile table eans_plus as (
SELECT STOCK_EAN, count(*) as count_ean
FROM my_table
group by 1
having count_ean > 1
) with data primary index (stock_ean) on commit preserve rows;

SELECT a.STOCK_EAN, a.ITE_VARIATION_ID
from my_table a inner join eans_plus b on a.stock_ean = b.stock_ean
;

但是这需要一段时间来执行(>140 秒),因为表非常大,我想知道是否有更有效的方法来执行此操作,或者通过避免执行两个查询或添加索引。我在 Teradata 上使用 alation

【问题讨论】:

    标签: sql filter count teradata


    【解决方案1】:

    您可以轻松地组合成一个查询,但这样做的性能提升可能非常小:

    WITH eans_plus AS (
    SELECT STOCK_EAN, count(*) as count_ean
    FROM my_table
    WHERE STOCK_EAN IS NOT NULL
    group by 1
    having count_ean > 1
    )
    SELECT a.STOCK_EAN, a.ITE_VARIATION_ID
    from my_table a inner join eans_plus b on a.stock_ean = b.stock_ean
    ;
    

    您还可以使用带有 QUALIFY 的窗口函数;不确定这是否会有所改进

    SELECT STOCK_EAN, ITE_VARIATION_ID
    FROM my_table a
    WHERE STOCK_EAN IS NOT NULL
    QUALIFY COUNT(*) OVER (PARTITION BY STOCK_EAN) > 1;
    

    STOCK_EAN 设为my_table 的主索引(如果还没有的话)可以改进这些查询,但您需要了解它如何影响此表的分布和其他使用。

    单表连接索引可能会提高这些查询的性能,但表维护会导致性能下降。

    CREATE JOIN INDEX my_table_aji AS
    SELECT STOCK_EAN, COUNT(*) as theCount FROM my_table
    GROUP BY 1
    PRIMARY INDEX (STOCK_EAN);
    

    编辑:添加WHERE STOCK_EAN IS NOT NULL 过滤

    【讨论】:

    • 谢谢弗雷德。问题:这些表实际上是视图(我有只读访问权限,我只对检索数据感兴趣)。连接索引表是否可以用作易失性表?
    • 您不能在易失性表或视图上定义连接索引,只能在基础表上定义。我同意@Gordon 的观点,即根据您的样本数据,过滤掉NULL 值可能有助于提高性能。我已经在上面编辑了我的答案。
    【解决方案2】:

    我正在尝试获取共享相同 STOCK_EAN 并且计数 > 1 的不同 ITE_VARIATION_ID

    对我来说,这听起来像是一个聚合查询:

    select STOCK_EAN, ITE_VARIATION_ID, COUNT(*)
    from t
    where stock_ean is not null
    group by STOCK_EAN, ITE_VARIATION_ID
    qualify sum(count(*)) over (partition by stock_ean) > 1;
    

    过滤NULL 值可能有助于提高性能。

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 2015-02-11
      • 2018-05-21
      相关资源
      最近更新 更多