2016-05-31 3 views
2

Я пытаюсь запустить запрос, который агрегирует данные, группирует результаты по нескольким различным полям и извлекает все соответствующие подстроки «SubTotal». (аналогично CUBE() в MSSQL)Несколько промежуточных итогов - порядок наложения полей

При использовании Group By Rollup(), я получаю только перестановки в соответствии с порядком полей Group By в функции Rollup. Например, запрос ниже (работает в общедоступном наборе данных), он возвращает промежуточный итог по году, или по году и месяцу, или по году, месяцу и медальону ... но он не является промежуточным по медальону.

SELECT 
    trip_year, 
    trip_month, 
    medallion, 
    SUM(trip_count) AS Sum_trip_count 
FROM 
    [nyc-tlc:yellow.Trips_ByMonth_ByMedallion] 
WHERE 
    medallion IN ("2R76", "8J82", "3B85", "4L79", "5D59", "6H75", "7P60", "8V48", "1H12", "2C69", "2F38", "5Y86", "5j90", "8A75", "8V41", "9J24", "9J55", "1E13", "1J82") 
GROUP BY 
    ROLLUP(trip_year, 
    trip_month, 
    medallion) 

Мой вопрос: Что я должен сделать для того, чтобы получить все различные перестановки «Sub Итоги» в результате одного запроса.

Уже пробовал: Союз с похожим запросом, но с другим порядком, он работает, но не изящный (для этого потребуется слишком много союзов). Thanks

ответ

1

Вы верны по обоим пунктам. В BigQuery ROLLUP уважает иерархию, рассматривая перечисленные поля как строго упорядоченный список. Их порядок не будет изменен во время агрегации.

Агрегат CUBE, который обычно встречается в других средах SQL, является неупорядоченным и фактически агрегирует все возможные порядковые/поднаборы его перечисленных полей. На данный момент CUBE не реализован в BigQuery. Обходной путь, который вы предлагаете, также я предлагаю. UNION все результирующие наборы от ROLLUP, используя каждую перестановку содержащихся в нем полей. Хотя это и не идеально, вы должны получить те же результаты.

Короче говоря, UNION с нескольких запросов с различных перестановок ROLLUP полей является только способ достичь этого в данный момент. Недостатки - это, как вы заявляете, что это может быть сложно поддерживать и может быть более дорогостоящим в запросах.

Если вы хотите увидеть CUBE, реализованный в BigQuery, я настоятельно рекомендую вам подать запрос функции на Big Query public issue tracker. Обязательно включите в этот запрос подробный пример использования.

UPDATE: Для поддержки feature request поданная О.П., пожалуйста звезда и вы будете получать уведомления с обновлениями.

+0

Соответствует ли этому вопросу вопрос? – Nicholas

+1

Ответ ясен, но это не решает мою проблему. Союз все не вариант. Это требует n! повторения одного и того же запроса. Если у меня 9 полей группировки, wuery становится невозможным mainatain. –

+0

Я согласен, что это решение неэффективно, более сложно поддерживать и может быть дорогостоящим. Обходной путь, который вы предлагаете, в настоящее время является ** единственным ** способом получения агрегатов, которые вы ищете в одном запросе. Следовательно, рекомендуется подать запрос функции. Я обновил свой ответ, чтобы отразить это более четко. – Nicholas

Смежные вопросы