[
https://issues.apache.org/jira/browse/CALCITE-1578?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15824317#comment-15824317
]
Julian Hyde commented on CALCITE-1578:
--------------------------------------
The problem of using {{ROW_NUMBER()}} is that it will output the same value for
ties. Thus if the 10th and 11th rows have the same value you will get 11 rows.
But I think it's the best we can do within standard SQL.
I think it would be useful to find a way to express this in the algebra, in a
way that is more direct than windowed aggregation + filter on row_number. In
Calcite's algebra as you know LIMIT and OFFSET are part of the Sort operator. I
think we could have {{Sort([x ASC, y DESC, z DESC], limitWithinGroup: 2, fetch:
10)}}, which means take the top 10 z values within each (x, y) group.
For current dialects of SQL we would implement using windowed aggregation +
filter on row_number, but at least we'd have the full picture in the algebra.
> Druid adapter: wrong semantics of topN query limit with granularity
> -------------------------------------------------------------------
>
> Key: CALCITE-1578
> URL: https://issues.apache.org/jira/browse/CALCITE-1578
> Project: Calcite
> Issue Type: Bug
> Components: druid
> Affects Versions: 1.11.0
> Reporter: Jesus Camacho Rodriguez
> Assignee: Jesus Camacho Rodriguez
> Priority: Critical
>
> Semantics of Druid topN query with limit and granularity is not equivalent to
> input SQL. In particular, limit is applied on each granularity value, not on
> the overall query.
> Currently, the following query will be transformed into a topN query:
> {code:sql}
> SELECT i_brand_id, floor_day(`__time`), max(ss_quantity),
> sum(ss_wholesale_cost) as s
> FROM store_sales_sold_time_subset
> GROUP BY i_brand_id, floor_day(`__time`)
> ORDER BY s DESC
> LIMIT 10;
> {code}
> Previous query outputs at most 10 rows. In turn, the equivalent SQL query for
> a Druid topN query should be expressed as:
> {code:sql}
> SELECT rs.i_brand_id, rs.d, rs.m, rs.s
> FROM (
> SELECT i_brand_id, floor_day(`__time`) as d, max(ss_quantity) as m,
> sum(ss_wholesale_cost) as s,
> ROW_NUMBER() OVER (PARTITION BY floor_day(`__time`) ORDER BY
> sum(ss_wholesale_cost) DESC ) AS rownum
> FROM store_sales_sold_time_subset
> GROUP BY i_brand_id, floor_day(`__time`)
> ) rs
> WHERE rownum <= 10;
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)