Google BigQuery: как запросить количество общих значений между двумя разными значениями? - PullRequest
0 голосов
/ 29 октября 2019

Я работаю с некоторыми данными новостной рассылки и пытаюсь показать количество пользователей, подписавшихся на более чем одну новостную рассылку (перекрытие пользователей между списками). Я использую данные новостной рассылки в Google BigQuery и DataStudio для визуализации.

Мой набор данных возвращает одну строку для каждой комбинации пользователь + новостная рассылка. Поэтому, если пользователь подписался на три разных новостных письма, на нем будет отображаться:

+---+------------+--------------+
|   | Name       |  Newsletter  |
+---+------------+--------------+
| 1 | User A     | Newsletter 1 |
| 2 | User A     | Newsletter 2 |
| 3 | User A     | Newsletter 3 |
+---+------------+--------------+

Я ограничиваю ввод комбинаций перекрытия до 2.

МОЙ ВОПРОС : Как мне запросить исходный набор данных, чтобы получить количество перекрывающихся пользователей для всех возможных комбинаций? Я уверен, что есть какой-то способ сделать это с помощью различных операторов CASE, но это утомительно инеэффективен. Хотите знать, может быть, есть более простой способ, о котором я не думаю.

Дополнительные сведения о том, как я думаю о визуализации, что может повлиять на результат:

Поскольку я ограничиваю каждыйВ сочетании с двумя информационными бюллетенями, я подумал, что тепловая карта может быть хорошим способом попытаться показать эти данные с количеством пользователей в обоих списках в каждом «пересечении». enter image description here

Но чтобы сделать это в DataStudio, мне нужно, чтобы данные отображались в таком формате: enter image description here

Это похоже на результат CROSS JOIN, где всеразличные комбинации представлены в столбце A и столбце B. Таким образом, есть наложение, но это необходимая настройка для его визуализации (по крайней мере, это единственный способ, который, я думаю, выполним).

Итак, если я собираюсь использовать этот конкретный метод, как мне запросить мой набор данных, чтобы вернуть его в этом формате?

Также открыт для других идей о том, как думать / визуализировать эту конкретную ситуацию, но хотел задать мой конкретный вопрос.

1 Ответ

1 голос
/ 29 октября 2019

Похоже, вы ищете что-то, как показано ниже

#standardSQL
SELECT A, B, IFNULL(`Count`, 0) AS `Count`
FROM (
  SELECT DISTINCT t1.Newsletter AS A, t2.Newsletter AS B 
  FROM `project.dataset.table` t1, `project.dataset.table` t2
) LEFT JOIN (
  SELECT t1.Newsletter AS A, t2.Newsletter AS B, COUNT(1) AS `Count` 
  FROM `project.dataset.table` t1, `project.dataset.table` t2
  WHERE t1.Name = t2.Name AND t1.Newsletter != t2.Newsletter
  GROUP BY A, B
) USING (A, B)
...