在GBase 8a 8.6.2Build43版本,开始支持在开窗函数和普通排序order 部分指定null值的位置,包括 nulls first, 和 nulls last,不之指定时默认是nulls last效果。
目录导航
数据
请关注里面的values 为 888的数据。有2行。
gbase> select * from t1;
+------+--------+---------------------+
| id   | value  | birth               |
+------+--------+---------------------+
|    1 |    234 | NULL                |
|    2 |    567 | NULL                |
|    3 |    888 | NULL                |
|    4 |    999 | NULL                |
|    5 | 555555 | 2020-01-03 00:00:00 |
|    4 |    888 | 2021-04-13 00:00:00 |
+------+--------+---------------------+
6 rows in set (Elapsed: 00:00:00.00)
开窗查询
默认是nulls last
gbase> select id,value,birth,row_number() over(partition by value order by birth) num from t1;
+------+--------+---------------------+-----+
| id   | value  | birth               | num |
+------+--------+---------------------+-----+
|    4 |    888 | 2021-04-13 00:00:00 |   1 |
|    3 |    888 | NULL                |   2 |
|    4 |    999 | NULL                |   1 |
|    1 |    234 | NULL                |   1 |
|    2 |    567 | NULL                |   1 |
|    5 | 555555 | 2020-01-03 00:00:00 |   1 |
+------+--------+---------------------+-----+
6 rows in set (Elapsed: 00:00:00.10)
gbase> select id,value,birth,row_number() over(partition by value order by birth nulls last) num from t1;
+------+--------+---------------------+-----+
| id   | value  | birth               | num |
+------+--------+---------------------+-----+
|    4 |    888 | 2021-04-13 00:00:00 |   1 |
|    3 |    888 | NULL                |   2 |
|    4 |    999 | NULL                |   1 |
|    1 |    234 | NULL                |   1 |
|    2 |    567 | NULL                |   1 |
|    5 | 555555 | 2020-01-03 00:00:00 |   1 |
+------+--------+---------------------+-----+
6 rows in set (Elapsed: 00:00:00.06)
row_number nulls first
可以看到 null 值排在了最前面了。
gbase> select id,value,birth,row_number() over(partition by value order by birth nulls first) num from t1;
+------+--------+---------------------+-----+
| id   | value  | birth               | num |
+------+--------+---------------------+-----+
|    3 |    888 | NULL                |   1 |
|    4 |    888 | 2021-04-13 00:00:00 |   2 |
|    4 |    999 | NULL                |   1 |
|    1 |    234 | NULL                |   1 |
|    2 |    567 | NULL                |   1 |
|    5 | 555555 | 2020-01-03 00:00:00 |   1 |
+------+--------+---------------------+-----+
6 rows in set (Elapsed: 00:00:00.07)
rank nulls first
gbase> select id,value,birth,rank() over(partition by value order by birth nulls first)  num from t1;
+------+--------+---------------------+-----+
| id   | value  | birth               | num |
+------+--------+---------------------+-----+
|    3 |    888 | NULL                |   1 |
|    4 |    888 | 2021-04-13 00:00:00 |   2 |
|    4 |    999 | NULL                |   1 |
|    1 |    234 | NULL                |   1 |
|    2 |    567 | NULL                |   1 |
|    5 | 555555 | 2020-01-03 00:00:00 |   1 |
+------+--------+---------------------+-----+
6 rows in set (Elapsed: 00:00:00.11)
普通排序
数据
其中id=10有2行,name有一个数值为null。
gbase> select * from t1;
+------+--------------+
| id   | name         |
+------+--------------+
|   10 | 10101010     |
|  100 | 100100100100 |
|   10 | NULL         |
|    1 | 1111         |
+------+--------------+
4 rows in set (Elapsed: 00:00:00.01)
单列排序(NULL列)
结果和预期相符,默认是null last。
gbase> select * from t1 order by name;
+------+--------------+
| id   | name         |
+------+--------------+
|  100 | 100100100100 |
|   10 | 10101010     |
|    1 | 1111         |
|   10 | NULL         |
+------+--------------+
4 rows in set (Elapsed: 00:00:00.03)
gbase> select * from t1 order by name nulls first;
+------+--------------+
| id   | name         |
+------+--------------+
|   10 | NULL         |
|  100 | 100100100100 |
|   10 | 10101010     |
|    1 | 1111         |
+------+--------------+
4 rows in set (Elapsed: 00:00:00.03)
gbase> select * from t1 order by name nulls last;
+------+--------------+
| id   | name         |
+------+--------------+
|  100 | 100100100100 |
|   10 | 10101010     |
|    1 | 1111         |
|   10 | NULL         |
+------+--------------+
4 rows in set (Elapsed: 00:00:00.04)
多列排序(NULL列靠后)
和预期相符。
gbase> select * from t1 order by id,name;
+------+--------------+
| id   | name         |
+------+--------------+
|    1 | 1111         |
|   10 | 10101010     |
|   10 | NULL         |
|  100 | 100100100100 |
+------+--------------+
4 rows in set (Elapsed: 00:00:00.03)
gbase> select * from t1 order by id,name nulls first;
+------+--------------+
| id   | name         |
+------+--------------+
|    1 | 1111         |
|   10 | NULL         |
|   10 | 10101010     |
|  100 | 100100100100 |
+------+--------------+
4 rows in set (Elapsed: 00:00:00.02)
gbase> select * from t1 order by id,name nulls last;
+------+--------------+
| id   | name         |
+------+--------------+
|    1 | 1111         |
|   10 | 10101010     |
|   10 | NULL         |
|  100 | 100100100100 |
+------+--------------+
4 rows in set (Elapsed: 00:00:00.03)