Странная ошибка в запросе BigQuery SQL, ищу объяснение.

Вопрос или проблема

SELECT 
    DISTINCT 
    CONCAT(ue.vb_name, ue.b_name) AS Uber_Eats_Slug,
    CONCAT(gh.vb_name, gh.b_name) AS Grub_Hub_Slug,
    FORMAT_TIMESTAMP('%Y-%m-%d %H:%M', CAST(ue.timestamp AS TIMESTAMP)) AS uber_formatted_datetime,
    FORMAT_TIMESTAMP('%Y-%m-%d %H:%M', CAST(gh.timestamp AS TIMESTAMP)) AS grubhub_formatted_datetime
FROM 
    `arboreal-vision-339901.take_home_v2.virtual_kitchen_ubereats_hours` AS ue,
    `arboreal-vision-339901.take_home_v2.virtual_kitchen_grubhub_hours` AS gh

GROUP BY 
    Uber_Eats_Slug, Grub_Hub_Slug, uber_formatted_datetime,grubhub_formatted_datetime
LIMIT 1000;

Когда этот запрос выполняется, он выдает только одно повторяющееся значение для Uber_Hub_Slug и uber_formatted_datetime. Как это возможно, даже когда используется функция DISTINCT, если в извлекаемых данных нет переменной, которая бы отличалась? Как избежать этой ошибки и получить необходимые значения? Данные читаются так, как должны, когда выполняются отдельно для обоих наборов данных.

DISTINCT означает, что в результирующем наборе не будет двух записей, у которых все столбцы совпадают. У вас есть

    DISTINCT 
    CONCAT(ue.vb_name, ue.b_name) AS Uber_Eats_Slug,
    CONCAT(gh.vb_name, gh.b_name) AS Grub_Hub_Slug,
    FORMAT_TIMESTAMP('%Y-%m-%d %H:%M', CAST(ue.timestamp AS TIMESTAMP)) AS uber_formatted_datetime,
    FORMAT_TIMESTAMP('%Y-%m-%d %H:%M', CAST(gh.timestamp AS TIMESTAMP)) AS grubhub_formatted_datetime

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

Ваш GROUP BY это

GROUP BY 
    Uber_Eats_Slug, Grub_Hub_Slug, uber_formatted_datetime,grubhub_formatted_datetime

что гарантирует, что четыре поля будут сгруппированы. Если вы хотите GROUP BY Uber_Eats_Slug, uber_formatted_datetime, то сделайте это. Тем не менее, похоже, что желание заключалось в том, чтобы сгруппировать Uber на одной стороне, а Grub на другой и соединить их. Вы можете достичь этого, разделив их, сделав один запрос для Uber, другой для Grub, использовать их как подзапросы и соединить два результирующих набора любым удобным вам способом.

.

Ответ или решение

Вопрос о том, почему ваш запрос в BigQuery возвращает одинаковые значения для Uber_Hub_Slug и uber_formatted_datetime, даже несмотря на использование функции DISTINCT, требует детального обсуждения. Давайте рассмотрим ключевые моменты, которые могут помочь вам разобраться с данной проблемой.

Проблематика

Запрос выстраивается следующим образом:

SELECT 
    DISTINCT 
    CONCAT(ue.vb_name, ue.b_name) AS Uber_Eats_Slug,
    CONCAT(gh.vb_name, gh.b_name) AS Grub_Hub_Slug,
    FORMAT_TIMESTAMP('%Y-%m-%d %H:%M', CAST(ue.timestamp AS TIMESTAMP)) AS uber_formatted_datetime,
    FORMAT_TIMESTAMP('%Y-%m-%d %H:%M', CAST(gh.timestamp AS TIMESTAMP)) AS grubhub_formatted_datetime
FROM 
    `arboreal-vision-339901.take_home_v2.virtual_kitchen_ubereats_hours` AS ue,
    `arboreal-vision-339901.take_home_v2.virtual_kitchen_grubhub_hours` AS gh
GROUP BY 
    Uber_Eats_Slug, Grub_Hub_Slug, uber_formatted_datetime, grubhub_formatted_datetime
LIMIT 1000;

Причина проблемы

Функция DISTINCT работает в рамках всех полей, указанных в запросе, а GROUP BY также применяется ко всем перечисленным параметрам. Если данные в таблицах uber_eats_hours и grubhub_hours не предполагают разнообразия для остальных полей запроса, вы получите лишь одно уникальное сочетание значений. То есть, если, например, для всех записей Uber_Eats_Slug и uber_formatted_datetime генерируются одинаковые значения, даже несмотря на наличие нескольких записей, вы получите одни и те же результаты.

Решение

Чтобы обойти данную проблему и получить необходимые результаты, можно использовать один из следующих подходов:

  1. Использование подзапросов для объединения данных: Вы можете сделать отдельные запросы для каждой из таблиц и затем объединить их, что позволит более гибко управлять данными. Например:

    WITH ue_data AS (
        SELECT 
            CONCAT(vb_name, b_name) AS Uber_Eats_Slug,
            FORMAT_TIMESTAMP('%Y-%m-%d %H:%M', CAST(timestamp AS TIMESTAMP)) AS uber_formatted_datetime
        FROM 
            `arboreal-vision-339901.take_home_v2.virtual_kitchen_ubereats_hours`
    ),
    gh_data AS (
        SELECT 
            CONCAT(vb_name, b_name) AS Grub_Hub_Slug,
            FORMAT_TIMESTAMP('%Y-%m-%d %H:%M', CAST(timestamp AS TIMESTAMP)) AS grubhub_formatted_datetime
        FROM 
            `arboreal-vision-339901.take_home_v2.virtual_kitchen_grubhub_hours`
    )
    SELECT 
        DISTINCT ue.Uber_Eats_Slug,
        gh.Grub_Hub_Slug,
        ue.uber_formatted_datetime,
        gh.grubhub_formatted_datetime
    FROM 
        ue_data ue
    JOIN 
        gh_data gh ON <условие для соединения>;
  2. Проверка данных: Убедитесь, что в ваших исходных таблицах действительно есть различия. Выполните отдельные выборки из обеих таблиц, чтобы выяснить, что именно мешает разнообразию в результатах.

  3. Работа с фильтрами: Если вы знаете, что вам нужны только определенные записи (например, по дате или другим параметрам), добавьте условия в ваш запрос, чтобы сократить объем данных и повысить вероятность уникальности результатов.

Заключение

Для получения различных значений в вашем SQL-запросе необходимо учитывать, как обрабатываются данные из обеих таблиц. Подход с подзапросами и объединениями предоставит вам более глубокое понимание структуры данных и поможет избежать ограничения, связано с работой функции DISTINCT и GROUP BY. Эти подходы не только устранят вашу текущую проблему, но и улучшат читаемость и поддерживаемость вашего кода в будущем.

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

Оцените материал
Добавить комментарий

Капча загружается...