문제

나는 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
.

세 가지 문제 / 질문 :

  1. 큰 쿼리가 일부 임베디드 조건부 로직을 사용하여 count (distinct field)를 수행 할 수있는 방법이 있어야하는 것처럼 보입니다. 위의 시나리오에서 조인을 피하는 방법이 있습니까?
  2. 100,000보다 큰 값과 별개의 것은 나를 위해 실패했습니다. 나는 10,000,000의 뚜렷한 계산을 할 수 있기를 원합니다. 계산 및 큰 값이있는 성능 문제가 있었습니까? 이게 다루어지고 있니?
  3. 선택한 내의 다른 명령문에서 SELECT에서 선언 된 / 계산 된 필드 이름을 사용할 수 있습니까? 톱 예제에서는 ROUND 문에서 수식을 반복하는 대신 결과의 이름을 사용하고 싶습니다. (즉,

    을 지정하고 싶습니다.

    total_sunbutter_meals_per_day / total_meals.

    대신에

    카운트 (어퍼 (성분)에는 "태양 버터", 100000) / 카운트 (별개 인 사람, 10000000)

  4. 도움을 위해 미리 감사드립니다!

도움이 되었습니까?

해결책

질문 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)
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top