表SQL中出现的次数的数量SQL regexp

时间:2016-06-17 20:20:28

标签: sql amazon-redshift

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

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

我试图使用正则表达式创建一个新的红色视图,但是它得到了奇怪的结果,它并不总是正确构建。所以有一天它会说伙伴出现15次,然后是接下来的17次,然后是接下来的15次,当时伙伴身份计数实际上没有变化。

非常感谢任何帮助。

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;

1 个答案:

答案 0 :(得分:0)

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

外部查询的下一个GROUP BY 1必须为GROUP BY partner_id

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

如果您希望订购最终结果,请在您的ORDER BY partner_id查询后的小组后面添加OUTER或类似条款。

看起来您从partnerid分割partnerids的方式也存在问题,但我对此并不乐观,因为我需要了解您的观点及其提供的数据,以了解该如何会影响partnerid的记录数。

接下来LEFT JOIN上的util.seq_0_to_500语句我非常确定您可以放弃s.i = 1,因为第一个条件也会满足2 greater 1 1}}比left join。不过,您的inner join实际上更像positron_articles,因为您排除了s.i > 0中没有inner的任何非匹配。

奇怪的是,您的整个加入和partnerids查询会被丢弃,因为您只需要在regexp_count (partner_ids,',') = 0中没有逗号的文章:util.seq_0_to_500

我建议您为partner table发布代码,如果您有regex_count(partnerids,partnerid),请让我们知道这一点,因为根据具体情况,您可以使用该附加表轻松获得答案regexp_count有效。我怀疑regex_count('12345,678',1234)示例greater将返回0而不是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 ,此时您无法选择将分隔的字符串拆分为另一个表,然后再计算或构建新的匹配函数

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

regexp_count

我实际上会纠正自己,因为我想到了一种在没有partnerid的情况下加入合作伙伴表的方法。因此,如果您有合作伙伴表,这可能适合您。如果不是,您将需要拆分字符串。它主要测试partneridspartnerids的整个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 ,在{{1}}的开头,中间还是末尾。如果满足其中一个,则返回记录。

{{1}}