【问题标题】:How to get results of multiple aggregations in a single druid query?如何在单个德鲁伊查询中获取多个聚合的结果?
【发布时间】:2022-03-29 23:51:51
【问题描述】:

假设我有一个名为t_student_details 的表:

 Name    Age    Marks     Sport       City     ........ (multiple columns)
======  =====  =======   =======     ======
Jason    11      45       tennis     New York
Mark     12      42       football   New York
Jessica  11      43       tennis     Orlando
Brad     13      46       tennis     Orlando
  .
  .
  .
(multiple rows)

我想在单个查询中获取有关学生的某些信息。这就是我在 Postgres 中要做的:

WITH sports_filter AS(
    SELECT * FROM t_student_details WHERE sport=\'tennis\'
)
SELECT JSON_BUILD_OBJECT(\'max_age\', (SELECT MAX(age) FROM sports_filter),
                         \'min_age\', (SELECT MIN(age) FROM sports_filter),
                         \'city_wise_marks_mean\', (SELECT JSON_AGG(mean_items)
                                                 FROM (SELECT city, AVG(marks) FROM sports_filter
                                                       GROUP BY city) AS mean_items)

Postgres 中上述 SQL 查询的结果将是

{\"max_age\": 46,
 \"min_age\": 43,
 \"city_wise_marks_mean\": [{\"New York\": 45, \"Orlando\": 44.5}]}     

很明显,我在单个查询中获得了有关属于运动“网球”的学生的多个聚合/信息。这种查询方式也只获取必要的数据,而不是所有的数据。

我如何使用德鲁伊实现这一目标?我不一定需要输出响应采用完全相同的格式,但是如何在同一个查询中获取所有这些统计信息,而不必获取学生的所有详细信息?是否可以使用 Apache Druid 在单个查询中获得所有这些信息?

    标签: database analytics druid pydruid


    【解决方案1】:

    据我了解您的 Postgres 查询应该像使用 GROUPING SETS 一样简单

    WITH sports_filter AS(
        SELECT * FROM t_student_details WHERE sport='tennis'
    )
    SELECT City, MIN(Marks), MAX(Marks), AVG(Marks)
    FROM sports_filters
    GROUP BY CUBE (City)
    

    GROUP BY CUBEGROUP BY GROUPING SETS ( (City), () ) 的简写

    这应该会导致 City 为 NULL 的一行,这是您的整体最小/最大/平均,每个城市都有一行。

    【讨论】:

      【解决方案2】:

      是的,这应该是可能的。 Druid 支持两种查询语言:Druid SQLnative queries。支持具有以下结构的SELECT queries

      [ EXPLAIN PLAN FOR ]
      [ WITH tableName [ ( column1, column2, ... ) ] AS ( query ) ]
      SELECT [ ALL | DISTINCT ] { * | exprs }
      FROM { <table> | (<subquery>) | <o1> [ INNER | LEFT ] JOIN <o2> ON condition }
      [ WHERE expr ]
      [ GROUP BY [ exprs | GROUPING SETS ( (exprs), ... ) | ROLLUP (exprs) | CUBE (exprs) ] ]
      [ HAVING expr ]
      [ ORDER BY expr [ ASC | DESC ], expr [ ASC | DESC ], ... ]
      [ LIMIT limit ]
      [ OFFSET offset ]
      [ UNION ALL <another query> ]
      

      连同这些Aggregation functions

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-31
        相关资源
        最近更新 更多