카운트 내의 논리적 검사 및 성능 문제 (DISTINCT FOO)
-
23-12-2019 - |
문제
나는 Runs and Very Versually 쿼리를 가지고 있으며, 불행히도 비율을 얻으려면 비율을 얻기 위해 똑같은 쿼리가 거의 똑같은 쿼리 결과에 가입해야합니다 ... 3 분이 걸릴 수 있습니다. 이것은 내가하고 싶은 일입니다 .... (조인을 피하는 것이 쿼리 시간 속도가 빨라질 수 있다고 가정 함)
SELECT
date,
meal,
country,
COUNT(DISTINCT person, WHERE UPPER(ingredient) CONTAINS "SUN BUTTER", 10000000) as total_sunbutter_meals_per_day
COUNT(DISTINCT person, 10000000) as total_meals
ROUND(100*total_sunbutter_meals_per_day/total_meals,1) as percentage_meals_sunbutter
FROM [project:dataset.menu]
GROUP BY date, meals, country
.
이것은 내가해야 할 일입니다 ....
SELECT
total.date as date,
total.meal as meal,
total.country as country,
total_sunbutter_meals_per_day,
total_meals_per_day,
ROUND(100*total_sunbutter_meals_per_day/total_meals,1) as percentage_meals_sunbutter
FROM
(
SELECT
date,
meal,
country,
COUNT(DISTINCT person, 100000) as total_sunbutter_meals_per_day
FROM [project:dataset.menu]
WHERE
UPPER(ingredient) CONTAINS "SUN BUTTER"
GROUP BY date, meals, country
) as sunbutter
JOIN
(
SELECT
date,
meal,
country,
COUNT(DISTINCT person, 100000) as total_meals_per_day
FROM [project:dataset.menu]
GROUP BY date, meals, country
) as total
ON total.date = sunbutter.date AND total.meal = sunbutter.meal AND total.country = sunbutter.country
.
세 가지 문제 / 질문 :
- 큰 쿼리가 일부 임베디드 조건부 로직을 사용하여 count (distinct field)를 수행 할 수있는 방법이 있어야하는 것처럼 보입니다. 위의 시나리오에서 조인을 피하는 방법이 있습니까?
- 100,000보다 큰 값과 별개의 것은 나를 위해 실패했습니다. 나는 10,000,000의 뚜렷한 계산을 할 수 있기를 원합니다. 계산 및 큰 값이있는 성능 문제가 있었습니까? 이게 다루어지고 있니?
-
선택한 내의 다른 명령문에서 SELECT에서 선언 된 / 계산 된 필드 이름을 사용할 수 있습니까? 톱 예제에서는 ROUND 문에서 수식을 반복하는 대신 결과의 이름을 사용하고 싶습니다. (즉,
을 지정하고 싶습니다.total_sunbutter_meals_per_day / total_meals.
대신에카운트 (어퍼 (성분)에는 "태양 버터", 100000) / 카운트 (별개 인 사람, 10000000)
도움을 위해 미리 감사드립니다!
해결책
질문 1 :
다음과 같이 두 개의 별개의 필드가있는 내부 쿼리를 만들 수 있습니다.
SELECT date, meal, country, COUNT(DISTINCT person) total_meals, COUNT(DISTINCT sunbutter_person) total_sunbutter_meals, FROM (SELECT date, meal, country, person, IF(UPPER(ingredient) CONTAINS "SUN BUTTER", person, NULL) sunbutter_person FROM [project:dataset.menu]).
질문 2 :
BigQuery의 Count (DISTINCT)는 대략적인 결과를 반환합니다. 정확한 결과가 반환되는 임계 값을 늘리면 단일 작업자가 이러한 모든 사용자를 추적해야하기 때문에 성능이 상처를줍니다 (결국 쿼리가 실패하게됩니다). BigQuert Count (별개의 값) VS 수 (가치) 자세한 정보를 보려면
정확한 결과를 필요로하는 경우, 대안은 count (*)를 사용하여 각각 그룹을 사용하는 것입니다. 이는 확장 가능한 방식으로 고유 한 요소에 대해 정확한 카운트를 제공합니다.
문제의 문제를 약간 다른 방식으로 해결해야합니다. 같은 것 :
SELECT date, meal, country, COUNT(*) total_meals, SUM(sunbutter) total_sunbutter_meals, FROM (SELECT date, meal, country, IF(UPPER(ingredient) CONTAINS "SUN BUTTER", 1, 0) sunbutter, FROM [project:dataset.menu] GROUP EACH BY date, meal, country, person) GROUP BY date, meal, country.
질문 3 :
현재 동일한 SELECT 문의 다른 필드를 참조 할 수 없으며 아직 해당 기능을 추가 할 계획이 없습니다. 그러나 항상 다른 쿼리에서 쿼리를 묶을 수 있습니다.
대신 :
SELECT 17 AS a, a + 1 AS b.
쓸 수 있습니다 :
SELECT a, a + 1 AS b FROM (SELECT 17 AS a).