【issues】窗口函数限制排序会导致返回结果异常

【StarRocks版本】2.5.1

使用窗口函数,如row number,rank等作为子查询,在where 中限制排序为1,会发现查询结果中出现丢失,多次查询丢失数据不同。

具体的查询例子和结果集发下?

tmp_error_by_window.csv (31.4 KB)
SELECT
*
FROM (
SELECT *
, row_number() OVER (PARTITION BY asin,月,年份,国家 ORDER BY ts_ms DESC ) AS rn
FROM tmp.error_by_window
) mt
WHERE mt.rn = 1

可以试下这个SQL,每次查询结果都不一样

麻烦提供下建表语句,还有执行sql时的所有session变量(show variables)

建表语句
– tmp.error_by_window definition

CREATE TABLE error_by_window (
dt date NULL COMMENT “”,
tenant_id bigint(20) NULL COMMENT “”,
运营人员 varchar(1048576) NULL COMMENT “”,
年份 bigint(20) NULL COMMENT “”,
bigint(20) NULL COMMENT “”,
国家 varchar(1048576) NULL COMMENT “”,
品牌 varchar(1048576) NULL COMMENT “”,
品类 varchar(1048576) NULL COMMENT “”,
asin varchar(1048576) NULL COMMENT “”,
销售额 tinyint(4) NOT NULL COMMENT “”,
ts_ms bigint(20) NULL COMMENT “”
) ENGINE=OLAP
DUPLICATE KEY(dt, tenant_id, 运营人员)
COMMENT “OLAP”
DISTRIBUTED BY HASH(asin) BUCKETS 21
PROPERTIES (
“replication_num” = “3”,
“in_memory” = “false”,
“storage_format” = “DEFAULT”,
“enable_persistent_index” = “false”,
“compression” = “LZ4”
);

information_schema_session_variables.csv (3.8 KB)

你在问题中表达的「结果不一样」是指结果的顺序不稳定么?

SELECT * FROM (
  SELECT *, 
    row_number() OVER (PARTITION BY asin,月,年份,国家 ORDER BY ts_ms DESC ) AS rn
  FROM error_by_window
) mt
WHERE mt.rn = 1

这个sql中,虽然在窗口函数的子句中指定了partition by列和order by列,但是这个只影响窗口函数的执行,但并不保证最终结果也按照这些列排序。

如果要得到稳定的结果,要在最后加个order by,如下,你可以试下这个sql的结果是否稳定

SELECT * FROM (
  SELECT *, 
    row_number() OVER (PARTITION BY asin,月,年份,国家 ORDER BY ts_ms DESC ) AS rn
  FROM error_by_window
) mt
WHERE mt.rn = 1
ORDER BY asin,月,年份,国家, ts_ms

跟顺序无关,我遇到的问题是返回的数据行数不同,都会有数据丢失

好的,我本地按照你提供的建表语句以及数据无法复现你说的这个问题。麻烦提供下两个不同结果的profile,我这边再根据profile分析一下。

我也无法提供更多的信息了,问题表现是每次返回的结果是随机数量,并不固定

麻烦根据这个文档拿一下profile吧。

Snipaste_2023-05-22_15-54-28

我们没有对应的选项

貌似社区版是从fe_ip:8030看profile文件的。。你这个是be的界面

show frontends,可以查IP和端口
「IP」和「HttpPort」

查了,只能是admin登录吗

应该就是查询的账号密码吧。