<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Mehdi Safiri</title>
        <link>https://virgool.io/feed/@mahdisafiri</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-18 05:01:17</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1867110/avatar/zBGlJE.jpg?height=120&amp;width=120</url>
            <title>Mehdi Safiri</title>
            <link>https://virgool.io/@mahdisafiri</link>
        </image>

                    <item>
                <title>دیتا دیکشنری در power BI با استفاده از  کوئری های  DMV</title>
                <link>https://virgool.io/@mahdisafiri/%D8%AF%DB%8C%D8%AA%D8%A7-%D8%AF%DB%8C%DA%A9%D8%B4%D9%86%D8%B1%DB%8C-%D8%AF%D8%B1-power-bi-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%DA%A9%D9%88%D8%A6%D8%B1%DB%8C-%D9%87%D8%A7%DB%8C-dmv-hhsjmpaz27ol</link>
                <description>در این مقاله قصد داریم روش ایجاد یک لغت نامه برای دیتا مدل خود بوسیله کوئری های DMV در SSAS Tabular و چرایی آن را شرح دهیم.· چرا باید لغت نامه دیتایی داشته باشیم؟هر چقدر مدل ما پیچیده تر می شود، ما به تهیه اسناد بیشتری درباره مدل خود نیاز داریم.هر چقدر Measure ها و فرمول های پیچیده تر باشند، تماس ها و سوالات از طرف کاربران بیشتر می شود. و این فرایند بسیار وقت گیر و حوصله سر بر می شود.بهترین راه برای کم کردین این تماس های پشتیبانی، این است که گزارشات در شفاف ترین حالت باشند.اینکه تعداد Measure ها زیاد و بیاد آوردن کاربردهای آن ها بسیار سخت می شود موضوع متداولی است. چه برای توسعه دهندگان و چه کاربران.یک راه حل این است که یک سند توصیفی درباره آن ها به توسعه دهندگان و کاربران ارائه شود. ولی این اسناد هم مانند خیل دیگر اسناد در یک فولدر بایگانی و بلا استفاده می مانند. به جای این کار بیهوده بهتر است یک دیکشنری داخل خود گزارش ایجاد کنیم.برای تعداد زیاد  Measure  ها کار بسیار طاقت فرسایی می شود که تک تک توصیف ارائه کنیم. اغلب پر کاربرد ترین ها یا مبهم ترین ها را توصیف می کنیم.· دیتا دیکشنری چیست؟به بیان ساده نوعی جدول مرجع برای  Measure ها وتوصیفات آنهاست.این جدول بایستی در یک صفحه خاص از گزارش برای کاربر یا توسعه دهنده قرار داده شود. تا براحتی در مواقع نیاز به آن رجوع کنند.· کوئری DMV چیست؟  Analysis Services Dynamic Management Viewsکوئری هایی هستند درباره اجزائ داخل مدل تبولار، عملیات سرور و سلامت سرور اطلاعات ارائه می کنند.· روش ایجاد این کوئری ها برای دیتا دیکشنریدر ابتدا وقتی در حال توسعه مدل خود هستیم باید بدانیم که با راست کلیک بر روی Measure و گزینه describtion می توانیم توضیحاتی برای کاربران و توسعه دهندگان دیگر اضافه کنیم (زمان توسعه Measure ها بهترین زمان است).برای ایجاد این کوئری ها ابتدا باید یک کانکشن با مدل تبولار ایجاد کرده و از جستجوگر اسکیما TMSCHEMA_MEASURES که اطلاعاتی از اجزای Measure داخل هر جدول ارایه می کند استفاده می کنیم.از قسمت Get Data روی گزینه    SQL Server Analysis Services database را انتخاب می کنیم.بعد از تنظیم ادرس سرور و دیتابیس کوئری زیر را اضافه می کنیم.SELECT  [Name], [Expression], [IsHidden], [DisplayFolder], [Description]FROM    $SYSTEM.TMSCHEMA_MEASURESخروجی به شکل زیر می شود.اگر بخواهیم همه اطلاعات Measure ها را استخراج کنیم کوئری زیر را میزنیم.SELECT  *FROM    $SYSTEM.TMSCHEMA_MEASURESقانون طلایی برای داشتن دیتا دیکشنری شفاف به شرح زیر است.· مخفی کردن Measure های hidden· نشان دادن ستون های مرتبط· عدم نمایش فرمول های DAX· سازماندهی Measure ها بر اساس فولدر برای دسترسی بهتر.· اعتبار سنجی توصیف هر  Measure با کاربر نهایی· ایجاد دو Slicer  یکی برای Folder ها و Measure Name· اطمینان از فعال کردن Search Box برای slicer ها برای راحتی در جستجوی نام  Measure ها.برای بهبود تجربه کاربری می توانیم یک  Action Button برای هر صفحه از گزارش بگذاریم که از آن صفحه مستقیم به صفه دیکشنری بیاید.و به همین صورت دکمه Back برای برگشت به صفحه قبلی گزارش.جمع بندی:· این دیکشنری ها به ازای هر مدل باید جداگانه ایجاد شود· بهتر است نظر کاربران نهایی در این توصیفات دخیل شود.· این مدل فقط  در SSAS Model کار می کند.</description>
                <category>Mehdi Safiri</category>
                <author>Mehdi Safiri</author>
                <pubDate>Sat, 18 Mar 2023 10:31:04 +0330</pubDate>
            </item>
                    <item>
                <title>تشخیص تقلب در Power Bi با الگوریتم لون اشتاین</title>
                <link>https://virgool.io/@mahdisafiri/%D8%AA%D8%B4%D8%AE%DB%8C%D8%B5-%D8%AA%D9%82%D9%84%D8%A8-%D8%AF%D8%B1-power-bi-%D8%A8%D8%A7-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-%D9%84%D9%88%D9%86-%D8%A7%D8%B4%D8%AA%D8%A7%DB%8C%D9%86-qv9sfkmyhood</link>
                <description>این الگوریتم چی میگه؟فاصله لون‌اشتاین بین دو رشته به وسیلهٔ کمترین تعداد عملیات مورد نیاز برای تبدیل یک رشته به رشته دیگر معین می‌شود، که یک عملیات می‌تواند یک ضمیمه، یا جایگزینی یک کارکتر باشد.به عنوان مثال فاصله لوناشتاین بین &quot;kitten&quot; و &quot;sitting&quot; برابر ۳ است. همان‌طور که می‌بینیم حداقل سه ویرایش برای تبدیل یکی به دیگری وجود دارد و کمتر از آن ممکن نیست:kitten → sitten(با جایگزینی &#x27;s&#x27; به جای&#x27;k&#x27;)sitten → sittin(با جایگزینی &#x27;i&#x27; به جای&#x27;e&#x27;)sittin → sitting(با وارد کردن &#x27;g&#x27; در انتها)یعنی ما می خواهیم شباهت رشته هامونو که در این مثال نام مشتری ها است را با یک لیست از نام مثلا متقلب ها یا تبهکارا مقایسه کنیم و ببینیم این نام ها با هر کدوم از Watch List ما چقدر شباهت دارن و در آخر مثلا شباهت های بالای 90 در صد رو بیشتر تحت نظر میگیریم. یعنی یه جور خوشه بندی انجام میدیم.روش کار هم بصورت مراحل زیر هستش1 - دیتاست Contoso را از SQL Server لود می کنیم.2- برای راحتی بیشتر ستون های نا لازم رو پاک میکنیم و فقط اسم ها و فامیل ها رو نگه میداریم.3- یک ستون افزوده به این جدول اضافه می کنیم که طول رشته اسم ها رو محاسبه کنه.String length = LEN(DimCustomer[FirstName])
خروجی به این شکل میشه.این ستون در مراحل بعدی برای Measure مقایسه بکار میاد.4- حالا جدول Watch List را لود می کنیم که واسه ما توسط Enter Data بصورت دستی وارد می کنیم به شکل زیر.5- یک Measure داریم که زیاد پیچیده نیست و بشکل زیر نوشته میشه و روی جدول اصلی اعمال میشه.6- حالا تقریبا کار تمومه . یک اسلایسر برای Watch List.7- یک جدول برای نام ها و میزان شباهت.همانطور که می بینید شباهت alvin با شخص مورد نظر ما که Kevin هست 60 درصد و شباهت  Devin  80 درصد است.8- تنظیم شباهت روی حساسیت مورد نظرو تمام</description>
                <category>Mehdi Safiri</category>
                <author>Mehdi Safiri</author>
                <pubDate>Sat, 11 Mar 2023 10:27:15 +0330</pubDate>
            </item>
                    <item>
                <title>تقسیم بندی مشتری بر اساس عملکرد خرید در Power BI</title>
                <link>https://virgool.io/@mahdisafiri/%D8%AA%D9%82%D8%B3%DB%8C%D9%85-%D8%A8%D9%86%D8%AF%DB%8C-%D9%85%D8%B4%D8%AA%D8%B1%DB%8C-%D8%A8%D8%B1-%D8%A7%D8%B3%D8%A7%D8%B3-%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF-%D8%AE%D8%B1%DB%8C%D8%AF-%D8%AF%D8%B1-power-bi-ziiiigztc8eb</link>
                <description>در این مقاله می خواهیم مشتریان را بر اساس تاریخچه عملکرد در خرید ، گروه بندی کنیم.1- برای این کار از انبار داده NorthWind استفاده می کنیم. دیتا را در power BI لود می کنیم.NorthWind Data model1- مبلغ کل فروش را  بعنوان ستون افزوده در  salesfact حساب میکنیم. یعنی:sales amount= Quantity *UnitPrice2- در مرحله بعد یک Measure برای مجموع فروش می نویسیم.total sales = SUM(&#039;SalesFact &#039;[sales amount])3- ستون های فروش سالانه را در جدول Customers بعنوان ستون افزوده اضافه می کنیمsales 1996 = CALCULATE(&#039;SalesFact&#039;[total sales],&#039;SalesFact&#039;[order year]=1996)همچنین برای سال 1997sales 1997 = CALCULATE(&#039;SalesFact&#039;[total sales],&#039;SalesFact&#039;[order year]=1997)4- ستونی برای محاسبه تفاوت فروش سالانه ایجاد می کنیمSales Difference = &#039;Customers &#039;[sales 1997]-&#039;Customers&#039;[sales 1996]حالا بر اساس این تفاوت عملکرد ها در این دو سال می توانیم مشتریان را در چند دسته زیر تقسیم کنیم.Perfect, Good, Normal, Badبرای این کار از گزینه Enter Data یک جدول میسازیم.ستون Index برای محاسبه اصلی آخر کار ایجاد شده است. نام جدول را Segment میگذاریم.1- حالا در جدول Customers ستون تحلیلی اصلی خود را بر مبنای ستون Sales Difference و ایندکس جدول افزوده مان ایجاد می کنیم.performance =SWITCH(TRUE(),&#039;Customers (2)&#039;[sales difference]&gt;=10000,&amp;quotperfect&amp;quot,&#039;Customers (2)&#039;[sales difference]&gt;=0,&amp;quotgood&amp;quot,&#039;Customers (2)&#039;[sales difference]&gt;-10000,&amp;quotNormal&amp;quot,&#039;Customers (2)&#039;[sales difference]&lt;=-10000,&amp;quotbad&amp;quot,BLANK())مثال ساده تصویری از ویژوالیزیشن.</description>
                <category>Mehdi Safiri</category>
                <author>Mehdi Safiri</author>
                <pubDate>Sat, 04 Mar 2023 09:04:01 +0330</pubDate>
            </item>
            </channel>
</rss>