Избавьтесь от пустого результата из вывода reg_ex_split_table

У меня есть запрос, который подсчитывает все слова в одном столбце и в результате дает мне частоту и ранг частоты слова. По какой-то причине я продолжаю получать строку, в которой нет ни слова. Как мне избавиться от этого?

Стол:

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

Можете ли вы предоставить минимальный воспроизводимый пример, чтобы можно было исследовать проблему? Кроме того, видя, что вы собираетесь задать новый вопрос, я бы порекомендовал принять ответ на ваш предыдущий вопрос.

GMB 18.12.2020 20:45

Извините, я обновил вопрос, чтобы включить воспроизводимый пример

mehsheenman 18.12.2020 21:55
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
127
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Можете ли вы использовать его в предложении 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

Я пробовал это, но, к сожалению, я все еще получаю тот же результат

mehsheenman 18.12.2020 19:40
Ответ принят как подходящий

Проблема с внутренним 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)

Демо на DB Fiddle

Другие вопросы по теме