Как исключить записи, используя оператор Qualify в Teradata - PullRequest
0 голосов
/ 06 января 2020

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

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

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 имеет и AB C и DEF, которые должны быть исключены.

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

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

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

Ответы [ 3 ]

2 голосов
/ 07 января 2020
Select *
from table1
Qualify min(Prod) over (partition by id)='ABC'
    and max(Prod) over (partition by id)='ABC'

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

0 голосов
/ 06 января 2020

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

Select id,prod ,
count(prod)
from
table1
group by 
id,
prod
having count(prod) = 1
0 голосов
/ 06 января 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. QUALIFY

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

...