Power Query には、文字、数値、ブール値というプリミティブ値と、リスト、レコード、テーブルという構造化された値があります。
リストは、順序つけられた値のシーケンスであり、 "{" で始まり "}" で終了します。リストが空の場合は、 "{}" となります。リストのサイズに制限はありません。
{1,2}
リストは、クエリとクエリの受け渡しで使われ、最終的なデータモデルとして使用されることはほとんどありません。それでも、リストの使い方をマスターすると、できることの幅が広がると思い、まとめてみました。
連続する番号を含むリスト
例えば、1から100までの整数をもつリストは以下のようになります。
{1..100}
{1..47, 49..100}
ただし、連続して生成できる値と個数には制限があります。数値は-2147483646から2147483647まで。個数は2,147,483,647個までです。32ビット整数値で表現できる値を超えると下記のようにエラーとなります。
リスト自体に個数制限はないので、以下のようなリストは作成可能です。
{-2147483646..0, 1..2147483647, 1..2147483647}
List.Numbers
List.Numbers(
    start as number,     // 初期値
    count as number,     // 作成する値の数
    optional increment as nullable number  // 増分値
) as list
List.Numbersを使うと、上記32ビット整数値を超えるリストを作成可能です。
let
    Source = List.Numbers( 1, 2147483648, 1 )
in
    Source
List.Generate
List.Generatgeは、パラメータを全て関数で記述します。
    List.Generate(
        initial as function,        // 初期関数
        condition as function,      // 条件関数
        next as function,           // 生成関数
        optional selector as nullable function  // セレクター関数
    ) as list
初期の値を10にし、0以上を条件とし、1づつ引いていく場合、以下のような式になります。
    List.Generate(
        () => 10,        // 初期値
        each _ > 0,      // 条件式
        each _ - 1,      // 生成式
        each _           // セレクター
    ) as list

 この場合、セレクターは省略しても同じ結果を得ることができます。
List.Repeat
与えられたリストを指定された回数繰り返すリストを作成します。
    List.Repeat(
        list as list,
        count as number
    ) as list
    List.Repeat(
        {1,2},
        3
    )
List.Transform
リストの項目に関数を適用します。
    List.Transform(
        list as list,
        transform as function
    ) as list
    List.Transform(
        {1,2,3},
        each _ * 2
    )
List.TransformMany
List.TransformManyは、与えられたリストをcollectionTransformで処理し、resultTransformで元のリストの値とcollectionTransformで処理された値を使って処理し、その結果をリストで返します。
    List.TransformMany(
        list as list, 
        collectionTransform as function, 
        resultTransform as function
    ) as list
List.TransformMany(
     {2019..2022},                   
     (x)   => {#date(x, 1 ,1)},  
     (x,y) => Text.From(x) &" -> "& Date.ToText( y, "yyyy/MM/dd" ))
List.Accumulate
アキュムレータ(累算器)を使用して、listの値を順に処理していきます。
    List.Accumulate(
        list as list, 
        seed as any, 
        accumulator as function
    ) as any
    List.Accumulate(
        {1,2,3,4,5}, 
        0, 
        (state, current) => state + current
    ) // 15
リストの結合
List.Combine
リストの結合には、List.Combineを使用します。
let
    list1 = {0,1,2,3,4},
    list2 = {5,6,7,8,9},
    Source = List.Combine({list1, list2})
in
    Source
簡単に、&で結合することもできます。
let
    list1 = {0,1,2,3,4},
    list2 = {5,6,7,8,9},
    Source = list1 & list2
in
    Source
List.Union
List.Unionは、2つのリストを結合します。list1とlist2の間で共通する要素は1つになります。
let
    list1 = {1,2,3,4,5},
    list2 = {5,6,7,8,9},
    Source = List.Union({list1, list2})
in
    Source
list1とlist2に共通する5は、1つになります。
リストの差分
List.Difference
List.Difference(
    list1 as list, 
    list2 as list, 
    optional equationCriteria as any
) as list
リスト{"a","b","c"}のうち、{"a","b","C"}に含まれない値をリストで返します。大文字、小文字は区別されます。
List.Difference(
    {"a","b","c"},
    {"a","b","C"}
) // {"c"}
以下のように、equationCriteriaを使用して、大文字、小文字の区別をしないよう指定すると、空のリストが返されます。
List.Difference(
    {"a","b","c"},
    {"a","b","C"},
    Comparer.OrdinalIgnoreCase
) // {}
また、リスト1に同じ値が複数あり、リスト2には1つだけある場合は、リスト1から1つだけ削除されます。
List.Difference(
    {"a","a","b","c"},
    {"a","b"}
) // {"a","c"}
equationCriteria については、「List.Containsの引数 equationCriteria を使う」を参照
List.RemoveMatchingItems
List.RemoveMatchingItems(
    list1 as list, 
    list2 as list, 
    optional equationCriteria as any
) as list
リスト1からリスト2にある値をすべて削除します。List.Differenceと違い、リスト1に重複する値があっても、すべて削除されます。
List.Difference(
    {"a","a","b","c"},
    {"a","b"}
) // {"c"}
Text.Split と Text.ToList
Text.Splitは、文字列中にあるセパレータで分割し、リストを作成します。
Text.Split(
    text as text, 
    separator as text
) as list
Text.Split(
    "Name|Address|PhoneNumber", 
    "|"
)
Text.ToListは、文字列を1文字づつ分割してリストを作成します。
Text.ToList("Hello World")
Binary.ToList
バイナリ値をリストに変換します。
Binary.ToList(Binary.FromList({1..10}))
List.First
List.Firstでは、リストの最初の値を取り出します。
let
    list1 = {0,1,2,3,4},
    Source = List.First(list1)
in
    Source  // 0
それ以外にも、以下のように任意の順番の値を取り出すことができます。
let
    list1 = {5,6,7,8,9},
    Source = list1{3}
in
    Source  // 8
List.Zip
リストとリストの同じ位置にある項目を結合します。リスト1とリスト2の個数が違う場合、nullになります。
List.Zip(
    {
        {1, 2, 3},
        {11,12}
    }
)
返される値は、以下のようなリストになります。
{
    { 1, 11 },
    { 2, 12 },
    { 3, null }
}
List.Average, List.Mode, List.Median, List.Percentile
リスト内の項目の平均、モード(最頻値)、中央値、パーセンタイルを求めます。
List.Covariance
2つのリストの共分散を返します。
List.Intersect
リスト値の積集合を返します。
List.Intersect(
    lists as list, 
    optional equationCriteria as any
) as list
List.Intersect(
    {
        {1..5}, 
        {2..6}, 
        {3..7}
    }
)  // {3, 4, 5}
List.MatchesAll, List.MatchesAny
List.MatchesAllは、リスト内のすべての値で条件が満たされる場合 true を返します。
List.MatchesAnyは、リスト内のいずれかの値が条件をみたす場合 true を返します。
List.MatchesAny(
    list as list, 
    condition as function
) as logical
List.MatchesAny(
    {9, 10, 11}, 
    each _  > 10
) // true
List.Select
リストから、条件に一致する値のリストを返します。
List.Select(
    list as list, 
    selection as function
) as list
例では、"ap" を含む値をリストにして返します。大文字、小文字の区別はしません。
List.Select(
    {"Apple", "Orange", "Grape"},
    each 
        Text.Contains(
            _, 
            "ap", 
            Comparer.OrdinalIgnoreCase
        )
)











