🔢
PowerQueryの並べ替えでnullの位置を制御する
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