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
因为第一个条件也会满足它,因为 2
是greater
比 1
。但是,您的 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
您好,我有一个 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
因为第一个条件也会满足它,因为 2
是greater
比 1
。但是,您的 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