问题遇到的现象和发生背景
最新在sprk-sql上开发,发现sort by的坑.
话不多说,
表结构
acct_id | currency_code | stmt_date | bal_flag | remark |
---|---|---|---|---|
A001 | 156 | 201901 | 9 | |
A001 | 156 | 201902 | Z | |
A001 | 156 | 201903 | 0 | |
A001 | 156 | 201904 | S | |
A001 | 156 | 201905 | B | |
A001 | 156 | 201906 | B |
问题相关代码,请勿粘贴截图
select acct_id,currency_code, concant(collect_list(bal_flag)) bal_flag
from (
select acct_id,currency_code,stmt_date,bal_flag
from
table
distribute by acct_id,currency_code
sort by acct_id,currency_code,stmt_date desc
) x
group by acct_id,currency_code
运行结果及报错内容
正确的结果应该是这样的.
| acct_id | currency_code | bal_flag |
| ------ | ------ | ------ |
| A001 | 156 | 201901 | BBS0Z9 |
但是在大量的数据情况下,竟然出现诡异的请况
| acct_id | currency_code | bal_flag |
| ------ | ------ | ------ |
| A001 | 156 | 201901 | BS0Z9B |
第一位的B会跑到最后面去.
我的解答思路和尝试过的方法
为了赶时间我改了下sql:
select acct_id,currency_code, regexp_replace(concant(',',sort_array(collect_list(bal_flag))),',?[0-9]{1,2}:','') bal_flag
from (
select acct_id,currency_code,stmt_date,concat(row_number() over(partition by acct_id,currency_code order by acct_id,currency_code,stmt_date desc),':',bal_flag) bal_flag
from
table
distribute by acct_id,currency_code
sort by acct_id,currency_code,stmt_date desc
) x
group by acct_id,currency_code
我想要达到的结果
得到的正确的结果就是这样的.
| acct_id | currency_code | bal_flag |
| ------ | ------ | ------ |
| A001 | 156 | 201901 | BBS0Z9 |
有哪位同学知道为啥sort by不行呢?