эффективный способ подсчета двоичных значений в столбцах таблицы больших данных? - PullRequest
0 голосов
/ 21 апреля 2019

Я использую большой запрос для данных о преступности в Чикаго в облачной платформе Google. Однако я хочу посчитать количество арестов и не арестов по типам преступлений. Это легко посчитать в пандах, но мне не совсем понятно, как считать двоичные значения в кадре данных с большим запросом. Кто-нибудь может дать мне возможную идею сделать этот счет?

Данные

поскольку данные о преступности в Чикаго большие, я не могу привести воспроизводимый пример здесь, но просмотреть данные о преступности здесь очень просто: Данные о преступности в Чикаго

вот небольшой предварительный просмотр:

crime data preview

мой большой запрос :

SELECT
  primary_type,
  count(arrest),
  COUNTIF(year = 2015) AS arrests_2015,
  COUNTIF(year = 2016) AS arrests_2016
FROM
  `bigquery-public-data.chicago_crime.crime`
WHERE
  arrest = TRUE
  AND year IN (2001,
    2018)
  AND primary_type NOT IN ('OTHER OFFENSE', ' all non-criminal types')
GROUP BY
  primary_type,
  arrest

но этот запрос дает мне пустой вывод, я не знаю, как заставить его работать.

цель

из таблицы данных о преступности в Чикаго, я хочу получить общее число арестов и не арестов по каждому основному типу, я хочу исключить ДРУГОЕ ПРЕСТУПЛЕНИЕ и все не преступные типы до конца 2018 года.

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

1 Ответ

2 голосов
/ 21 апреля 2019

Ниже должно работать

#standardSQL
SELECT
  primary_type,
  COUNT(arrest) arrest_total,
  COUNTIF(year = 2015) AS arrests_2015,
  COUNTIF(year = 2016) AS arrests_2016
FROM `bigquery-public-data.chicago_crime.crime`
WHERE arrest = TRUE
AND year BETWEEN 2001 AND 2018
AND primary_type NOT IN ('OTHER OFFENSE', ' all non-criminal types')
GROUP BY primary_type, arrest  

Я думаю, что ваша проблема была в строке ниже, где вы выбрали ТОЛЬКО 2001 и 2018 вместо всех лет между (по крайней мере, 2015 и 2016)

AND year IN (2001, 2018)   

Итак, вместо этого вы должны использовать ниже одного

AND year BETWEEN 2001 AND 2018   

Также, если вы хотите включить не аресты, вы можете использовать ниже

#standardSQL
SELECT
  primary_type,
  arrest,
  COUNT(arrest) arrest_total,
  COUNTIF(year = 2015) AS arrests_2015,
  COUNTIF(year = 2016) AS arrests_2016
FROM `bigquery-public-data.chicago_crime.crime`
WHERE year BETWEEN 2001 AND 2018
AND primary_type NOT IN ('OTHER OFFENSE', ' all non-criminal types')
GROUP BY primary_type, arrest

Примечание: я удалил WHERE arrest = TRUE здесь и добавил arrest в список SELECT

Вместо этих нескольких корректировок - ваш первоначальный запрос был совершенно правильным

Если вы хотите иметь одну выходную строку на primary_type, вы можете использовать ниже

#standardSQL
SELECT
  primary_type,
  COUNTIF(arrest) arrests,
  COUNTIF(NOT arrest) non_arrests,
  COUNT(arrest) arrest_total,
  COUNTIF(year = 2015) AS arrests_2015,
  COUNTIF(year = 2016) AS arrests_2016
FROM `bigquery-public-data.chicago_crime.crime`
WHERE year BETWEEN 2001 AND 2018
AND primary_type NOT IN ('OTHER OFFENSE', ' all non-criminal types')
GROUP BY primary_type   

Более того - если вы можете «увеличить» количество лет, как показано ниже (например, для 2015 года)

COUNTIF(year = 2015 AND arrest) AS arrests_2015,
COUNTIF(year = 2015 AND NOT arrest) AS non_arrests_2015,  

Есть ли программный способ подсчета количества арестов с 2001 по 2018 год по типу преступления

#standardSQL
SELECT
  primary_type,
  year,
  COUNTIF(arrest) arrests,
  COUNTIF(NOT arrest) non_arrests,
  COUNT(arrest) arrest_total
FROM `bigquery-public-data.chicago_crime.crime`
WHERE year BETWEEN 2001 AND 2018
AND primary_type NOT IN ('OTHER OFFENSE', ' all non-criminal types')
GROUP BY primary_type, year
...