全部產品
Search
文件中心

MaxCompute:ARRAY_SORT

更新時間:Jun 19, 2024

將ARRAY數組a中的元素根據comparator進行排序。

命令格式

array<T> array_sort(array<T> <a>, function<T, T, bigint> <comparator>)

參數說明

  • a:必填。ARRAY數組。array<T>中的T指代ARRAY數組元素的資料類型,數組中的元素可以為任意類型。

  • comparator:必填。用於比較ARRAY數組中2個元素大小的函數(內建函數或自訂函數)或運算式。

    comparator(a, b)的處理邏輯為:當a等於b時,返回0。當a小於b時,返回負整數。當a大於b時,返回正整數。如果comparator(a, b)返回NULL,則返回報錯。

    重要

    ARRAY_SORT中的比較函數要求是自洽的,即:

    • compare(a, b) > 0,則要求compare(b, a) < 0

    • compare(a, b) = 0,則要求compare(b, a) = 0

    • compare(a, b) < 0,則要求compare(b, a) > 0

    不自洽函數樣本如下:

    • (left, right) -> CASE WHEN left <= right THEN -1L ELSE 0L END

      假如設定a = 1, b = 1,則compare(a, b) = -1compare(b, a) = -1,兩個比較結果相互矛盾即函數不自洽。

    • (left, right) -> CASE WHEN left < right THEN -1L WHEN left = right THEN 0L ELSE 1L END

      假如設定a = NULL, b = 1,則compare(a, b) = 1compare(b, a) = 1,兩個比較結果相互矛盾即函數不自洽。

傳回值說明

返回ARRAY類型。

使用樣本

  • 樣本1:對數組array(5,6,1)進行排序。

    SELECT array_sort(array(5,6,1),(left,right)->
                      CASE 
                       WHEN left<right THEN-1L 
                       WHEN left>right THEN 1L 
                       ELSE 0L 
                      END
                     );

    返回結果如下:

    +------------+
    | _c0        |
    +------------+
    | [1,5,6]    |
    +------------+
  • 樣本2:

    select array_sort(a, (a,b)->
                      case 
                       when a.a>b.a then 1L 
                       when a.a=b.a then 0L 
                       else -1L 
                      end)
    from values (
      array(named_struct('a', 1, 'b', 10),
            named_struct('a', 3, 'b', 11),
            named_struct('a', 2, 'b', 12)))
      as t(a);

    返回結果如下:

    +------+
    | _c0 |
    +------+
    | [{a:1, b:10}, {a:2, b:12}, {a:3, b:11}] |
    +------+

相關函數

  • ARRAY_SORT函數屬於複雜類型函數,更多對複雜類型資料(例如ARRAY、MAP、STRUCT、JSON資料)的處理函數請參見複雜類型函數

  • ARRAY_SORT函數樣本中涉及->的使用,關於Lambda函數->的介紹,詳情請參見Lambda函數