У меня есть запрос, который подсчитывает все слова в одном столбце и в результате дает мне частоту и ранг частоты слова. По какой-то причине я продолжаю получать строку, в которой нет ни слова. Как мне избавиться от этого?
Стол:
CREATE TABLE dummy (
created_at TIMESTAMPTZ,
tweet TEXT);
Вставлять:
INSERT INTO dummy VALUES ('2020-12-18 00:00:00+00', 'foo squared');
INSERT INTO dummy VALUES ('2020-12-18 00:00:00+00', 'foo foo');
INSERT INTO dummy VALUES ('2020-12-18 00:00:00+00', 'foo foo');
INSERT INTO dummy VALUES ('2020-12-18 00:00:00+00', 'foo bar');
Запрос:
select *
from (
select date_trunc('day', created_at) as created_day, word, count(*) as cnt,
rank() over(partition by date_trunc('day', created_at) order by count(*) desc) rn
from dummy d
cross join lateral regexp_split_to_table(
regexp_replace(tweet, '\y(rt|co|https|bar|none)\y', '', 'g'),
'\s+'
) w(word)
group by created_day, word
) d
where created_day = CURRENT_DATE and word IS NOT NULL
order by rn
LIMIT 10;
Возвращает:
created_day | word | cnt | rn
------------------------+---------+-----+----
2020-12-18 00:00:00+00 | foo | 4 | 1
2020-12-18 00:00:00+00 | | 2 | 2
2020-12-18 00:00:00+00 | arm | 1 | 3
2020-12-18 00:00:00+00 | squared | 1 | 3
Я хотел бы избавиться от пустого слова:
created_day | word | cnt | rn
------------------------+---------+-----+----
2020-12-18 00:00:00+00 | foo | 4 | 1
2020-12-18 00:00:00+00 | arm | 1 | 2
2020-12-18 00:00:00+00 | squared | 1 | 3
Извините, я обновил вопрос, чтобы включить воспроизводимый пример
Можете ли вы использовать его в предложении where
?
where created_day = CURRENT_DATE
And word is not null -- this
order by rn;
Или вы можете использовать то же условие и здесь.
) w(word)
word is not null -- this
group by created_day, word
Я пробовал это, но, к сожалению, я все еще получаю тот же результат
Проблема с внутренним regexp_replace()
; когда совпадающая часть находится в конце строки, вы получаете пробел в конце строки. По сути, при применении к 'foo bar'
он генерирует 'foo '
.
Затем при синтаксическом анализе генерируется конечное слово, значением которого является пустая строка (''
).
Простой обходной путь - trim()
вывод regexp_replace()
, поэтому в основном замените:
cross join lateral regexp_split_to_table(
regexp_replace(tweet, '\y(rt|co|https|bar|none)\y', '', 'g'),
'\s+'
) w(word)
С:
cross join lateral regexp_split_to_table(
trim(regexp_replace(tweet, '\y(rt|co|https|bar|none)\y', '', 'g')),
'\s+'
) w(word)
Можете ли вы предоставить минимальный воспроизводимый пример, чтобы можно было исследовать проблему? Кроме того, видя, что вы собираетесь задать новый вопрос, я бы порекомендовал принять ответ на ваш предыдущий вопрос.