Фильтрация сводной таблицы в Sisense с отрицанием

Я пытаюсь реализовать простой фильтр в Sisense, но не могу понять.

Мои данные хранятся в базе данных PostgresQL. Минимальный пример выглядит примерно так:

CREATE TABLE fact_table (
    first_name text,
    salary integer
);

INSERT INTO fact_table VALUES ('John', 100), ('Jack', 200), ('Mary', 300), ('Klaus', 400);

CREATE TABLE dim_table (
    first_name text,
    last_name text    
);

INSERT INTO dim_table VALUES ('John', 'Smith'), ('Jack', 'Smith'), ('John', 'Jackson'), ('Mary', 'Smith'), ('Klaus', 'Jackson');

Я хочу создать сводную таблицу с first_name в рядах и salary как ценности в Sisense.

Теперь есть два сценария, по которым я хочу отфильтровать:

1) Выбрать все first_names, для которого существует кто-то по фамилии Смит

=> Легко в Sisense, просто создайте отношения на first_name <-> first_name и отфильтруйте "Смит"

Наш набор результатов - это {Джек, Джон, Мэри} и их зарплата.

2) Выбрать все first_names, которые не используются кем-либо с фамилией Смит. Это отрицание 1). Наш ожидаемый результат установлен {Klaus}.

Я не знаю, как это сделать. В SQL это тривиально:SELECT * FROM fact_table WHERE first_name NOT IN (SELECT first_name FROM dim_table WHERE last_name = 'Smith');

В Sisense подходящего варианта не нашел. Если я создаю фильтр списка и снимаю выделение Smith, я получаю все не-Smiths из моей dim_table, что логически не то же самое (и возвращает John вместо Klaus).

Должно быть, я упускаю что-то очевидное Любые идеи?

Большое спасибо!

1 ответ

Решение

Я думаю, что ваш 1-й и 2-й сценарий фильтра могут быть достигнуты с помощью пользовательского SQL в эластичной трубке. Вам нужно выполнить левое соединение обеих таблиц и получить каждую строку из фактов. В вашем фильтре first_name вы можете отменить выбор first_name как "Smith", но выбрать значения NULL, чтобы отобразить "Klaus"

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