У меня есть набор данных, сгруппированный по испытуемым, который заполняется в соответствии с действиями, которые они выполняют. Мне нужно найти, какой клиент делает A, а затем, в какой-то момент, делает B; но это не обязательно ...

1
Meissen 9 Апр 2021 в 22:11

2 ответа

Лучший ответ

Использовать условное агрегирование:

SELECT Subject
FROM tablename
WHERE ActionID IN ('A', 'B')
GROUP BY Subject
HAVING MAX(CASE WHEN ActionID = 'A' THEN ActionOrder END) <
       MIN(CASE WHEN ActionID = 'B' THEN ActionOrder END)

См. демонстрацию.

2
forpas 9 Апр 2021 в 19:21

Рассмотрим вариант ниже

select Subject 
from (
  select Subject, 
    regexp_replace(string_agg(ActionID, '' order by ActionOrder), r'[^AB]', '') check
  from `project.dataset.table`
  group by Subject
)
where not starts_with(check, 'B')
and check like '%AB%'

Выше предполагается, что Subject потенциально может выполнять одни и те же действия несколько раз, поэтому несколько дополнительных проверок в предложении where. В противном случае это было бы просто check = 'AB'

1
Mikhail Berlyant 9 Апр 2021 в 19:40