Как исключить записи с помощью оператора Qualify в Teradata

Я должен создать население для людей, у которых есть только одна ассоциация продукта (ABC), используя квалифицированное выражение.

Например, у меня есть данные

Id  Code  Prod  Date
101  202   ABC   2017-05-31
101  203   DEF   2017-04-30
102  302   ABC   2018-06-30

Из приведенных выше данных мне нужны данные для Id = 102, потому что этот идентификатор имеет только одно отношение prod, где, поскольку идентификатор 101 имеет как ABC, так и DEF, которые следует исключить.

Я попробовал следующее

 Select id,prod from table1
 Qualify row_number() over (partition by id order by Date)=1
Where prod=‘ABC’

При этом я получаю две записи в своих данных, которые мне не нужны. Ценю вашу помощь.


person ckp    schedule 06.01.2020    source источник
comment
Этот запрос дает вам две строки, потому что сначала применяется WHERE, а затем ROW_NUMBER() дает вам одну строку для каждого уникального Id (в данном случае 101 и 102). См. ниже другой вариант.   -  person ravioli    schedule 06.01.2020


Ответы (3)


Select *
from table1
Qualify min(Prod) over (partition by id)='ABC'
    and max(Prod) over (partition by id)='ABC'

И MIN, и MAX возвращают одно и то же значение ABC, поэтому другого значения нет.

person dnoeth    schedule 06.01.2020

Если вы хотите вернуть идентификаторы, которые имеют одно значение prod (ABC) в таблице, вы можете сделать что-то вроде этого:

SELECT id, prod
FROM (
  SELECT id, prod
  FROM table1
  GROUP BY id, prod -- Get unique (id, prod) combinations
  QUALIFY COUNT(prod) OVER(PARTITION BY id) = 1 -- Get id's with only one prod
) src
WHERE prod = 'ABC' -- Only get rows with "ABC" prod

Ключевым здесь является порядок, в котором Teradata обрабатывает запрос:

  1. Совокупность - GROUP BY
  2. OLAP — COUNT(prod) OVER()
  3. КВАЛИФИКАЦИЯ

Возможно, вы сможете переместить WHERE prod = 'ABC' в предложение QUALIFY и избавиться от внешнего SELECT, не уверен на 100%.

person ravioli    schedule 06.01.2020

Просто используйте «иметь» вместо «квалифицироваться». Я не вижу необходимости в оконных функциях. Что-то типа:

Select id,prod ,
count(prod)
from
table1
group by 
id,
prod
having count(prod) = 1
person Andrew    schedule 06.01.2020
comment
Как я прочитал вопрос, пользователю нужны только id's, которые имеют одно значение prod, которое должно быть ABC, поэтому вам нужно где-то это учитывать. Я думаю, что ответ Дитера хорошо помогает. - person ravioli; 07.01.2020