با استفاده از تابع List.Sort در پاورکوئری میتوان دادههای درون یک لیست را از کوچک به بزرگ (به ترتیب حروف الفبا) یا از بزرگ به کوچک (برعکس حروف الفبا) یا هر منطق دیگری مرتب نمود. این تابع بهصورت ذیل تعریف میگردد:
List.Sort( list as list, optional comparisonCriteria as any ) as list |
لذا این تابع دو ورودی به شرح ذیل دریافت میکند.
- در ورودی اول این تابع، لیست دادههایی که میخواهیم مرتب کنیم وارد میشود.
- در ورودی دوم این تابع، منطق مرتبسازی دادهها مشخص میشود. این ورودی اختیاری است و در صورت وارد نشدن، دادههای لیست مدنظر از کوچک به بزرگ (به ترتیب حروف الفبا) مرتب میشود. ولی میتوانیم در این ورودی مقدار Descending را وارد نماییم تا دادهها از بزرگ به کوچک (برعکس حروف الفبا) مرتب شوند. یا در حالت دیگر میتوان منطق مرتبسازی را خودمان با صورت تابع وارد نماییم.
بهمنظور شفاف شدن کارکرد این تابع، در جدول ذیل چند مثال پایه از این تابع آورده شده است.
فرمول | نتیجه |
=List.Sort({1,5,-2,-3}) |
{-۳,-۲,۱,۵} |
= List.Sort({1,5,2,3},Order.Descending) |
{۵,۳,۲,۱} |
= List.Sort({“a”,”x”,”b”,”c”}) |
{“a”,”b”,”c”,”x”} |
= List.Sort({“a”,”x”,”b”,”c”},Order.Descending) |
{“x”,”c”,”b”,”a”} |
در مثالهای قبل حالت ساده تابع Sort موردبررسی قرار گرفت که در آنها دادهها از بزرگ به کوچک یا از کوچک به بزرگ مرتبشدهاند، اما اگر بخواهیم حالتهای پیشرفته این تابع را استفاده کنیم، نیاز است منطق مدنظر جهت مقایسه دادهها را در ورودی دوم این تابع بهصورت تابع تعریف کنیم.
همانطور که در مثالهای فوق نشان داده شد، حاصل فرمول ذیل برابر است با {-۳,-۲,۱,۵}
List.Sort({1,5,-2,-3})
چراکه عدد -۳ از عدد ۱ کوچکتر است و ابتدای لیست آورده شده است.
حال اگر بخواهیم اعداد را بدون در نظر گرفتن علامت آنها باهم مقایسه کنیم، میتوانیم از فرمول ذیل استفاده کرد.
= List.Sort({1,5,-2,-3}, (x,y)=> Value.Compare(Number.Abs(x), Number.Abs(y)))
در این فرمول گفتهشده است جهت مقایسه دو مقدار X و Y ابتدا از تابع Number.Abs استفاده شود و مقدار قدر مطلق آنها (حالت بدون علامت آنها) به دست آید، سپس حالت قدر مطلق اعداد مبنای مقایسه قرار گیرد.. لذا حاصل فرمول فوق برابر است با لیست {۱,-۲,-۳,۵}
در مثال دیگر، با استفاده از فرمول ذیل، در خروجی فرمول ابتدا مقادیر زوج آورده میشود و سپس مقادیر فرد.
= List.Sort(
{۱,۲,۵,۴,۳},
(x,y)=>Value.Compare(Number.IsOdd(x), Number.IsOdd(y)))
خروجی فرمول فوق برابر است با {۲,۴,۱,۵,۳}. در این مثال علت اینکه عدد ۵ قبل از ۳ آورده شده است، این است که در لیست اصلی هم عدد ۵ قبل از ۳ است و طبق شرط موردبررسی، هر دو فرد هستند و مقدارشان در مقایسه یکسان است، لذا ترتیب آنها تغییری نمیکند.
در حالت دیگر با استفاده از فرمول ذیل متنهای آورده شده در لیست را مرتب کردهایم. اما بهجای در نظر گرفتن کاراکتر اول (کاراکتر سمت چپ) کاراکتر آخر (کاراکتر سمت راست) مبنای مرتب کردن قرارگرفته است.
= List.Sort(
{“AXY”,”XYA”,”WND”,”ACC”},
(x,y)=>Value.Compare (Text.End(x,1), Text.End(y,1))
)
حاصل فرمول فوق برابر است با {“XYA”,”ACC”,”WND”,”AXY”}