Фильтрация сводной таблицы в 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_name
s, для которого существует кто-то по фамилии Смит
=> Легко в Sisense, просто создайте отношения на first_name
<-> first_name
и отфильтруйте "Смит"
Наш набор результатов - это {Джек, Джон, Мэри} и их зарплата.
2) Выбрать все first_name
s, которые не используются кем-либо с фамилией Смит. Это отрицание 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"