id 在 table SQL 正则表达式中出现的次数

Count of how many times id occurs in table SQL regexp

您好,我有一个 redshift table 文章,上面有一个可以包含许多帐户的字段。因此,文章与帐户之间存在一对多的关系。

但是我想创建一个新视图,它在一列中列出合作伙伴 ID,在另一列中列出合作伙伴 ID 在文章中出现的次数 table。

我尝试使用正则表达式执行此操作并创建了一个新的 redshift 视图,但是我得到了奇怪的结果,它并不总是正确构建。所以有一天它会说一个合作伙伴出现了 15 次,然后是接下来的 17 次,然后是接下来的 15 次,此时合作伙伴 ID 计数实际上并没有改变。

如有任何帮助,我们将不胜感激。

SELECT partner_id,
       COUNT(DISTINCT id)
FROM (SELECT id,
             partner_ids,
             SPLIT_PART(partner_ids,',',i) partner_id
      FROM positron_articles a
        LEFT JOIN util.seq_0_to_500 s
               ON s.i < regexp_count (partner_ids,',') + 2
               OR s.i = 1
      WHERE i > 0
      AND   regexp_count (partner_ids,',') = 0
      ORDER BY id)
GROUP BY 1;

让我们从一些更明显的事情开始,看看我们是否可以开始收集其他信息。

您的外部查询的下一个 GROUP BY 1 需要 GROUP BY partner_id

接下来,您的 INNER 查询中不需要 order by,如果没有它,数据库引擎可能会更好地优化性能,因此删除 ORDER BY id.

如果您希望对最终结果进行排序,请在 OUTER 查询的分组依据之后添加一个 ORDER BY partner_id 或类似的子句。

看起来你如何从 partnerids 中拆分 partnerid 也有问题,但我对此并不肯定,因为我需要了解你的观点和它提供的数据才能知道这对 partnerid.

的记录数有何影响

接下来你在 util.seq_0_to_500 上的 LEFT JOIN 声明我很确定你可以放弃 s.i = 1 因为第一个条件也会满足它,因为 2greater1。但是,您的 left join 实际上更像 inner join,因为您随后从 positron_articles 中排除了任何没有 s.i > 0.

的非匹配项

奇怪的是,你的整个连接和 inner 查询都被丢弃了,因为你只想要 partnerids 中没有逗号的文章:regexp_count (partner_ids,',') = 0

我建议为您的 util.seq_0_to_500 发布代码,如果您有 partner table 也让我们知道这一点,因为您可能可以通过额外的 [= 更轻松地获得答案68=] 取决于 regexp_count 的工作方式。我怀疑 regex_count(partnerids,partnerid) 示例 regex_count('12345,678',1234) 会 return greater 而不是 0 在这一点上你别无选择,只能将分隔的字符串拆分为另一个 table在计算或构建新的匹配函数之前。

如果 regex_count 只匹配逗号之间的精确匹配并且你有一个合作伙伴 table 你的查询可以像这样简单:

SELECT
    p.partner_id
    ,COUNT(a.id) AS ArticlesAppearedIn
FROM
    positron_articles a
    LEFT JOIN PARTNERTABLE p
    ON regexp_count(a.partnerids,p.partnerid) > 0
GROUP BY
    p.partner_id

实际上我会更正自己,因为我只是想到了一个没有 regexp_count 的伙伴 table 的方法。因此,如果您有合作伙伴 table,这可能适合您。如果不是,您将需要拆分字符串。它主要测试 partnerid 是否是整个 partnerids,位于 partnerids 的开头、中间或结尾。如果满足其中之一,则记录为 returned。

SELECT
    p.partner_id
    ,COUNT(a.id) AS ArticlesAppearedIn
FROM
    PARTNERTABLE p
    INNER JOIN positron_articles a
    ON
       (
       CASE
          WHEN a.partnerids = CAST(p.partnerid AS VARCHAR(100)) THEN 1
          WHEN a.partnerids LIKE p.partnerid + ',%' THEN 1
          WHEN a.partnerids LIKE '%,' + p.partnerid + ',%' THEN 1
          WHEN a.partnerids LIKE '%,' + p.partnerid THEN 1
          ELSE 0
       END
       ) = 1
GROUP BY
    p.partner_id