Yaoxuan Wu created FLINK-41099:
----------------------------------

             Summary: Streaming RANK() / DENSE_RANK() OVER a non-time ORDER BY 
ignore ties (return the row count instead of the rank)
                 Key: FLINK-41099
                 URL: https://issues.apache.org/jira/browse/FLINK-41099
             Project: Flink
          Issue Type: Bug
          Components: Table SQL / Planner
    Affects Versions: 2.2.1, 2.3.0
            Reporter: Yaoxuan Wu


{code:python} from pyflink.table import EnvironmentSettings, TableEnvironment t 
= TableEnvironment.create(EnvironmentSettings.in_streaming_mode()) 
t.execute_sql("CREATE TEMPORARY VIEW v AS SELECT * FROM (VALUES (1, 'a'), (1, 
'b'), (2, 'c')) AS t(k, s)") t.execute_sql("SELECT k, s, RANK() OVER (PARTITION 
BY k ORDER BY k) AS r FROM v").print() # expected (and batch mode): (1, a, 1), 
(1, b, 1), (2, c, 1) # actual (final changelog):  (1, a, 2), (1, b, 2), (2, c, 
1) {code} The two rows with k = 1 are peers and must both get rank 1. 
DENSE_RANK() gives the same wrong values. Streaming returns the number of rows 
up to and including the peer group, i.e. COUNT(*) over the same window.  Cause: 
the streaming OVER aggregate creates its aggregate functions with 
{{AggregateUtil.transformToStreamAggregateInfoList}}, which passes 
{{orderKeyIndexes = null}} to {{AggFunctionFactory}}. {{RankAggFunction}} / 
{{DenseRankAggFunction}} are therefore built without order keys, and 
{{RankLikeAggFunctionBase.orderKeyEqualsExpression()}} with no keys returns 
{{literal(false)}}: every accumulated row counts as a new rank. Since 
{{NonTimeRangeUnboundedPrecedingFunction}} accumulates all peers before 
emitting one value for them, the peers get the count. The batch path passes the 
order key indexes and is correct.  Reproduces on 2.2.1, 2.3.0 and master.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to