Как получить строки, которые имеют ненулевые значения во всех периодах, но не существуют в другом документе той же компании? - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть база данных, где есть разные компоненты со значениями периода «Текущий» / «Исторический». Эти компоненты могут принадлежать разным документам одной и той же компании. «period» - это логический столбец с «current» и «историческим».

Моя производная таблица после нескольких объединений выглядит следующим образом -

company_id       document_id       component_id      value      period
1000                   100             1              456      current
1000                   100             1              870      historical
1000                   100             2              67       current 
1000                   100             2              NULL     historical
1000                   200             2              67       historical

Я хочу получить компонент_ид '1' сверху: он имеет ненулевые значения во всех периодах для document_id «100», но не существует для document_id «200». Значения столбцов "document_id", "company_id" & "component_id" не известны, поэтому не могут использоваться в запросе.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Я понимаю, что вам нужны компоненты, которые для данной компании принадлежат только одному document_id и не имеют значения null.

Если это так, вы можете агрегировать по component_id и company_id и реализовать логику фильтрации c в предложении having:

select company_id, component_id
from mytable t
group by company_id, component_id
having 
    bool_and(value is not null)              -- no "value" is "null"
    and min(document_id) = max(document_id)  -- only one distinct "document_id"
0 голосов
/ 26 апреля 2020

Если я правильно понимаю, вам нужен компонент, у которого есть документ, который не имеет значений для всех периодов. Если это так:

select distinct component_id
from t
group by component_id, document_id
having count(value) over (filter where period = 'current') = 0 or
       count(value) over (filter where period = 'historical') = 0 ;

Если это то, что вы хотите, то это один из немногих случаев, когда select distinct может использоваться с group by.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...