这是我在这里的第一篇文章,所以我会尽量保持简单易读。
在Postgres
中我可以查找字符串包含另一个字符串的次数,在我的示例中,我有一个带有情绪的列表,我正在尝试查找在论坛中提到它们的次数位于另一张桌子的帖子标题。在Postgres
中,我通常使用LEFT Join ON
中的table1 LIKE string from table2
字符串执行此操作。当我尝试在Bigquery
中执行此操作时,它无效,我尝试使用LIKE
,CONTAINS
和REGEXP_MATCH
。这些将是我想要的查询类型。
SELECT sentiment_type, count(*) FROM
((SELECT forum, page_link, post_title, user, posted_date, content
FROM [sandbox:Forum_data.forum_table]) t1
JOIN [sandbox:Taxonomies.sentiment_taxonomy] t2
ON lower(post_title) LIKE '%'||lower(sentiment)||'%') a
GROUP BY sentiment_type, sentiment
ORDER BY 3 desc
您是否知道Bigquery
中是否可以这样做?
谢谢。
答案 0 :(得分:0)
standard SQL中的查询将是这样的:
SELECT sentiment_type, count(*)
FROM (
SELECT forum, page_link, post_title, user, posted_date, content
FROM `sandbox.Forum_data.forum_table`) t1
JOIN `sandbox.Taxonomies.sentiment_taxonomy` t2
ON lower(post_title) LIKE CONCAT('%', lower(sentiment), '%')
GROUP BY sentiment_type, sentiment
ORDER BY 3 desc;
实际上,JOIN
或LEFT JOIN
在没有相等条件的情况下不具备可扩展性。根据表的大小,标准SQL可能会强制您包含相等性,例如ON t1.key = t2.key AND lower(post_title) LIKE CONCAT('%', lower(sentiment), '%')
(假设存在这样的密钥)。
答案 1 :(得分:0)
以下内容适用于旧版SQL
SELECT sentiment_type, sentiment, COUNT(*) as volume
FROM [sandbox:Forum_data.forum_table] t1
CROSS JOIN [sandbox:Taxonomies.sentiment_taxonomy] t2
WHERE LOWER(post_title) LIKE '%' + LOWER(sentiment) + '%'
GROUP BY sentiment_type, sentiment
ORDER BY 3 desc
答案 2 :(得分:0)
非常感谢大家,确实我不得不使用标准SQL,但它不适用于大型数据集,因此我的一位同事通过将字符串拆分为单词帮助我找到解决方案。最终结果并不完美但功能齐全,看起来像这样:
SELECT sentiment_type, SUM(vol) vol FROM
(
SELECT sentiment_type, a.vol vol, a.id id
FROM (
SELECT *
FROM (SELECT SPLIT(content,' ') AS content_ind
,Vol
,ID
FROM (SELECT content
,Vol
,ROW_NUMBER() OVER (ORDER BY content) ID
FROM (SELECT LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(content,'%',' '),'!',' '),'"',' '),'?',' '),'.',' '),',',' '),'/',' '),"'",' '),'-',' '),';',' '),':',' '),'(',' '),')',' '),'*',' '),'_',' '),'&',' '),'=',' '),'@',' ')) content
,COUNT(content) vol
FROM [sandbox:Forum_data.Expat_forum_data]
GROUP BY content)
ORDER BY 3)
)
GROUP BY 1,2,3) a JOIN
(SELECT LTRIM(RTRIM(sentiment)) sentiment, sentiment_type FROM [sandbox:Taxonomies.sentiment_taxonomy] WHERE LTRIM(RTRIM(sentiment)) NOT LIKE '% %') b
ON a.content_ind = b.sentiment
GROUP BY 1,2,3)
GROUP BY 1
ORDER BY 2 DESC