Фильтрация сводной таблицы в Sisense с отрицанием - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь реализовать простой фильтр в 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.

Теперь есть два сценария ios Я хочу отфильтровать:

1) Выбрать все first_name s, для которых существует кто-то с фамилией «Смит»

=> просто в Sisense, просто создайте связь по first_name <-> first_name и отфильтруйте 'Smith'

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

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 голос
/ 29 мая 2020

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

enter image description here

...