Как кластеризовать и устранять в SQL - Google BigQuery - PullRequest
0 голосов
/ 09 мая 2018

У меня есть данные только с 3 атрибутами

  • имя
  • болезнь
  • да / нет

Я былзастрял на этом весь день.Я только хочу создать две группы / кластеры VIRUS и FUNGUS

Многие пользователи были подвержены обоим

Как я могу создать группу, ТОЛЬКО подверглись воздействию VIRUS, затем найдите количествоэтой группы?

каждый раз, когда я продолжаю делать запрос, я продолжаю получать людей, которые также подверглись воздействию грибков.

это код, который я использую

SELECT name
FROM `dieases` 
WHERE illness IN (342, 2345, 9282) AND
      name NOT IN (SELECT name
                   FROM `dieseases`
                   WHERE campaign_id NOT IN (987, 457, 1283, 2212)
                  )

он не завершит запрос и продолжает падать!Я не могу показать вам данные, которые я боюсь, как частные медицинские данные!Мне нужна помощь!

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Я не играл с BiqQuery, но это стандартный способ SQL сделать это ...

SELECT
  CASE WHEN had_virus + had_fungus = 2 THEN 'Both'
       WHEN             had_fungus = 1 THEN 'Fungus'
                                       ELSE 'Virus'  END   AS exposure_type,
  COUNT(*)                                                 AS exposure_count
FROM
(
    SELECT
      Name,
      MAX(CASE WHEN illness IN (342, 2345, 9282)      THEN 1 END)   AS had_virus,
      MAX(CASE WHEN illness IN (987, 457, 1283, 2212) THEN 1 END)   AS had_fungus
    FROM
      diseases
    WHERE
         illness IN (342, 2345, 9282)
      OR illness IN (987, 457, 1283, 2212)
    GROUP BY
      Name
)
  IndividualSummary
GROUP BY
  exposure_type
0 голосов
/ 09 мая 2018

Одним простым способом было бы просто использовать условное агрегирование для проверки двух условий:

SELECT name
FROM diseases
GROUP BY name
HAVING
    SUM(CASE WHEN illness IN (342, 2345, 9282) THEN 1 ELSE 0 END) > 0 AND
    SUM(CASE WHEN illness IN (987, 457, 1283, 2212) THEN 1 ELSE 0 END) = 0;

Первая сумма утверждает воздействие вирусов, а вторая - нет воздействие грибов.

В другом подходе используется самостоятельное соединение:

SELECT d1.name
FROM diseases d1
LEFT JOIN diseases d2
    ON d1.name = d2.name AND
       d1.illness IN (342, 2345, 9282) AND
       d2.illnes IN (987, 457, 1283, 2212)
GROUP BY d1.name
HAVING COUNT(d2.name) = 0;

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

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