您好我有一个文章的红移表,其上有一个字段,可以包含许多帐户。因此,文章与帐户之间存在一对多的关系。
但是我想创建一个新视图,它在一列中列出合作伙伴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;
答案 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
的情况下加入合作伙伴表的方法。因此,如果您有合作伙伴表,这可能适合您。如果不是,您将需要拆分字符串。它主要测试partnerids
是partnerids
的整个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}}