🔢

PowerQueryの並べ替えでnullの位置を制御する

2024/08/22に公開

PowerQueryは、並べ替えでnullを常に最小値として扱うため、nullの位置は昇順では最初に、降順では最後になります。これを変えたい場合、Table.Sortの第2引数に関数を記述することで、nullの位置を制御できます。

Power Query M
let
    sample = #table(
        type table [Name = text, LastActivity = nullable date],
        {
            {"Alice", #date(2024, 8, 22)},
            {"Bob", null},
            {"Charlie", #date(2024, 8, 10)}
        }
    ),
    result = Table.Sort(
        sample,
        {
            each if [LastActivity] = null then 1 else 0,
            "LastActivity"
        }
    )
in
    result
Name LastActivity
Charlie 2024/08/10
Alice 2024/08/22
Bob null

次のようなSQLに相当します。

SQL Server 2017
SELECT * FROM
    (VALUES
        ('Alice', '2022-08-22'),
        ('Bob', null),
        ('Charlie', '2022-08-10')
    ) AS sample(Name, LastActivity)
ORDER BY
    CASE WHEN LastActivity IS NULL THEN 1 ELSE 0 END,
    LastActivity

※Oracleなど、NULLS FIRST/LAST に対応しているRDBMSなら、そちらを利用したほうが楽です。

このような並べ替えが頻出する場合、関数化しておくと便利です。
ここでは、NullsLastという関数名で定義したとします。

NullsLast
(columnName as text) => (row as record) =>
    if Record.Field(row, columnName) = null then 1 else 0

使用例は次の通り

NullsLast使用例
Table.Sort(
    sample,
    {
        NullsLast("LastActivity"),
        "LastActivity"
    }
)

Discussion