Как найти обязательные элементы в переменной, сгруппированной по другой переменной? - PullRequest
0 голосов
/ 22 апреля 2020

Теперь у меня есть переменная A и переменная B. Здесь переменная A действует как идентификатор группы для переменной B. Теперь я хочу выяснить, какие группы в A являются 6 обязательным содержимым B (которые являются b, c, d, e, f) не все присутствуют в переменной B и образуют флаг. Кто-нибудь знает, как сделать это в SAS или oracle?

Мой набор данных

enter image description here

Ожидаемый результат

enter image description here

Ответы [ 2 ]

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

Подсчет различных агрегатов в операторе фильтрации будет вычислять состояние, необходимое для назначения флага.

data have;
  infile cards missover;
  length A B $4;
  input A @;
  do while (1);
    input B @;
    if missing(B) then leave;
    output;
  end;
datalines;
1 a b c d e f d h 
2 a b c d e f g 
3 a b c d e h
;

proc sql;
  create table want as
  select a, b,
    count (distinct 
      case
        when b in ('a','b','c','d','e','f') then b
      end 
    ) ne 6 as flag
  from have
  group by a;
quit;
0 голосов
/ 22 апреля 2020

Этот запрос даст вам группу, имеющую все заданные значения.

SELECT A FROM YOUR_TABLE
WHERE B IN ('a','b','c','d','e','f')
GROUP BY A 
HAVING COUNT(DISTINCT B) = 6

Затем вы можете получить значения флага несколькими способами, один из способов - использовать LEFT JOIN

SELECT MYTABLE.A,MYTABLE.B, 
CASE WHEN SQ.A IS NOT NULL THEN 0 ELSE 1 END AS FLAG 
FROM YOUR_TABLE MYTABLE 
LEFT JOIN (
    SELECT A FROM YOUR_TABLE
    WHERE B IN ('a','b','c','d','e','f')
    GROUP BY A 
    HAVING COUNT(DISTINCT B) = 6
) SQ ON MYTABLE.A=SQ.A
...