我的 PieCloudDB 数据库中有一个 tweets 表。假设我有以下示例数据:
用户 ID | tweet_id | 推文日期 | 推文 |
---|---|---|---|
128 | 6 | 2024-02-01 | #生活充满惊喜。 |
133 | 9 | 2024-02-01 | 我对自己的成就#感到高兴。 |
146 | 13 | 2024-02-04 | NoSQL 与 SQL。 #数据库#技术 |
150 | 14 | 2024-02-05 | 晴朗的天气让大家#开心! |
155 | 18 | 2024-02-07 | #PieCloudDB 是云原生#数据库。 |
156 | 19 | 2024-02-10 | #快乐的人散发着正能量。 #乐观 |
168 | 30 | 2024-03-02 | 多么美好的#生活啊! |
我现在想要计算主题标签在二月份中出现在推文中的次数,并按计数降序和主题标签名称升序( 请注意,每条推文可能有多个主题标签)。对于上面的示例数据,我希望得到以下结果:
SELECT hashtag, COUNT(*) AS hashtag_count
FROM (
SELECT
tweet_id,
UNNEST(STRING_TO_ARRAY(SUBSTRING(tweet, POSITION('#' IN tweet)), ' ')) AS hashtag
FROM tweets
WHERE tweet_date >= '2024-02-01' AND tweet_date < '2024-03-01'
) AS subquery
WHERE hashtag LIKE '#%'
GROUP BY hashtag
ORDER BY hashtag_count DESC, hashtag ASC
但是我发现了一个问题。出现在末尾的主题标签将计算标点符号,例如 .
或
!
:
regular expressions
来解决这个问题。(我不太确定这是否适用于PieCloudDB),我刚刚在PostgreSQL中测试了它。
SELECT unnest(regexp_matches(tweet, '#\w+', 'g')) AS hashtag, COUNT(*) AS hashtag_count
FROM tweets
WHERE tweet_date >= '2024-02-01' AND tweet_date < '2024-03-01'
GROUP BY hashtag
ORDER BY hashtag_count DESC, hashtag ASC