メインコンテンツまでスキップ

array_sortby

array_sortby

説明

別の配列や、ラムダ式から変換した配列の要素に基づいて、配列の要素を昇順に並べ替えます。詳細はラムダ式を参照してください。この関数はv2.5からサポートされています。

2つの配列の要素は、キーと値のペアのような関係を持ちます。たとえば、b = [7,5,6] は a = [3,1,4] のソートキーです。キーと値のペアの関係に基づいて、2つの配列の要素は以下のように一対一の関係を持ちます。

配列

要素1

要素2

要素3

a

3

1

4

b

7

5

6

配列bは昇順にソートされ、[5,6,7]となります。配列aはそれに応じて[1,4,3]となります。

配列

要素1

要素2

要素3

a

1

4

3

b

5

6

7

構文

array_sortby(array0, array1)
array_sortby(<lambda function>, array0 [, array1...])
  • array_sortby(array0, array1)配列array0array1の昇順に並べ替えます。
  • array_sortby(<lambda function>, array0 [, array1...])ラムダ式から返された配列に基づいて、配列array0を並べ替えます。

パラメータ

  • array0: ソートしたい配列。配列、配列の式、またはnullである必要があります。配列の要素はソート可能でなければなりません。
  • array1: array0をソートするために使用するソート配列。配列、配列の式、またはnullである必要があります。
  • lambda function: ソート配列を生成するために使用されるラムダ式。

戻り値

配列を返します。

使用上の注意

  • この関数は配列の要素を昇順にのみ並べ替えることができます。
  • NULLの値は返される配列の先頭に配置されます。
  • 配列の要素を降順で並べ替えたい場合は、reverse関数を使用してください。
  • ソート配列(array1)がnullの場合、array0のデータは変更されません。
  • 返される配列の要素はarray0の要素と同じデータ型であり、null値の属性も同じです。
  • 2つの配列は同じ数の要素を持っている必要があります。そうでない場合、エラーが返されます。

次のテーブルは、この関数の使用方法を示すために使用されます。

CREATE TABLE `test_array` (
`c1` int(11) NULL COMMENT "",
`c2` ARRAY<int(11)> NULL COMMENT "",
`c3` ARRAY<int(11)> NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`c1`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`c1`)
PROPERTIES (
"replication_num" = "3",
"storage_format" = "DEFAULT",
"enable_persistent_index" = "false",
"compression" = "LZ4"
);

insert into test_array values
(1,[4,3,5],[82,1,4]),
(2,null,[23]),
(3,[4,2],[6,5]),
(4,null,null),
(5,[],[]),
(6,NULL,[]),
(7,[],null),
(8,[null,null],[3,6]),
(9,[432,21,23],[5,4,null]);

select * from test_array order by c1;
+------+-------------+------------+
| c1 | c2 | c3 |
+------+-------------+------------+
| 1 | [4,3,5] | [82,1,4] |
| 2 | NULL | [23] |
| 3 | [4,2] | [6,5] |
| 4 | NULL | NULL |
| 5 | [] | [] |
| 6 | NULL | [] |
| 7 | [] | NULL |
| 8 | [null,null] | [3,6] |
| 9 | [432,21,23] | [5,4,null] |
+------+-------------+------------+
9 rows in set (0.00 sec)

例 1: c3c2に基づいてソートします。この例では、比較のためにarray_sort()の結果も提供されます。

select c1, c3, c2, array_sort(c2), array_sortby(c3,c2)
from test_array order by c1;
+------+------------+-------------+----------------+----------------------+
| c1 | c3 | c2 | array_sort(c2) | array_sortby(c3, c2) |
+------+------------+-------------+----------------+----------------------+
| 1 | [82,1,4] | [4,3,5] | [3,4,5] | [1,82,4] |
| 2 | [23] | NULL | NULL | [23] |
| 3 | [6,5] | [4,2] | [2,4] | [5,6] |
| 4 | NULL | NULL | NULL | NULL |
| 5 | [] | [] | [] | [] |
| 6 | [] | NULL | NULL | [] |
| 7 | NULL | [] | [] | NULL |
| 8 | [3,6] | [null,null] | [null,null] | [3,6] |
| 9 | [5,4,null] | [432,21,23] | [21,23,432] | [4,null,5] |
+------+------------+-------------+----------------+----------------------+

例 2: ラムダ式から生成されたc2に基づいて配列c3をソートします。この例は例1と同等です。比較のためにarray_sort()の結果も提供されます。

select
c1,
c3,
c2,
array_sort(c2) as sorted_c2_asc,
array_sortby((x,y) -> y, c3, c2) as sorted_c3_by_c2
from test_array order by c1;
+------+------------+-------------+---------------+-----------------+
| c1 | c3 | c2 | sorted_c2_asc | sorted_c3_by_c2 |
+------+------------+-------------+---------------+-----------------+
| 1 | [82,1,4] | [4,3,5] | [3,4,5] | [82,1,4] |
| 2 | [23] | NULL | NULL | [23] |
| 3 | [6,5] | [4,2] | [2,4] | [5,6] |
| 4 | NULL | NULL | NULL | NULL |
| 5 | [] | [] | [] | [] |
| 6 | [] | NULL | NULL | [] |
| 7 | NULL | [] | [] | NULL |
| 8 | [3,6] | [null,null] | [null,null] | [3,6] |
| 9 | [5,4,null] | [432,21,23] | [21,23,432] | [4,null,5] |
+------+------------+-------------+---------------+-----------------+

例 3: c2+c3の昇順で配列c3をソートします。

select
c3,
c2,
array_map((x,y)-> x+y,c3,c2) as sum,
array_sort(array_map((x,y)-> x+y, c3, c2)) as sorted_sum,
array_sortby((x,y) -> x+y, c3, c2) as sorted_c3_by_sum
from test_array where c1=1;
+----------+---------+----------+------------+------------------+
| c3 | c2 | sum | sorted_sum | sorted_c3_by_sum |
+----------+---------+----------+------------+------------------+
| [82,1,4] | [4,3,5] | [86,4,9] | [4,9,86] | [1,4,82] |
+----------+---------+----------+------------+------------------+

参考