MySQL में पर्सेंटाइल की गणना करना एक दर्द हो सकता है। इसके लिए अभी तक कोई कार्य नहीं हैं। प्रतिशतक उपयोगकर्ताओं या ग्राहकों को रैंक और समूहीकृत करने के लिए उपयोगी होते हैं।
आप अपने सबसे मूल्यवान उपयोगकर्ताओं या ग्राहकों की पहचान कर सकते हैं और उनके लिए विशेष ऑफ़र बना सकते हैं। इसे करने के लिए तैयार प्रश्न है।
उदाहरण के लिए, आपके पास एक टेबल है आदेश जिसमें प्रत्येक उपयोगकर्ता के लिए सभी उत्पाद ऑर्डर शामिल हैं। आप पर्सेंटाइल की गणना करना चाहते हैं।
order +-----------+------------+----------+ | user_id | product | sales | +-----------+------------+----------+ | 1 | Soap | 10 | | 4 | Perfume | 100 | | 1 | Noodles | 20 | | 3 | Deo | 200 | +-----------+------------+----------+
percentiles +-----------+----------+---------+---------------+ | user_id | total | rank | percentile | +-----------+----------+---------+---------------+ | 1 | 30 | 3 | 33.33 | | 4 | 100 | 2 | 66.67 | | 3 | 200 | 1 | 100 | +-----------+----------+---------+---------------+
यहां एक क्वेरी है जिसका उपयोग आप योग के आधार पर MySQL में पर्सेंटाइल की गणना करने के लिए कर सकते हैं। बस कॉलम - user_id, बिक्री और तालिका - ऑर्डर को बदलें। यह प्रत्येक उपयोगकर्ता के लिए कुल बिक्री को एकत्रित करता है। फिर यह उन्हें कुल बिक्री पर रैंक करता है। अंत में, यह रैंक का उपयोग करके पर्सेंटाइल की गणना करता है।
select user_id,total,rank,round(100*(cnt-rank+1)/cnt,0) as percentile from (SELECT user_id,total,@curRank := @curRank + 1 AS rank FROM (select user_id,sum(sales) as total from `order` group by user_id) p, (SELECT @curRank := 0) r ORDER BY total desc ) as dt,(select count(distinct user_id) as cnt from `order`) as ct
यदि आपके पास तालिका में प्रत्येक उपयोगकर्ता के लिए पहले से ही कुल बिक्री है और प्रतिशतक की गणना के लिए तालिका का सीधे उपयोग करना चाहते हैं, तो यहां एक क्वेरी है
select user_id,total,rank,round(100*(cnt-rank+1)/cnt,0) as percentile from (SELECT user_id,total,@curRank := @curRank + 1 AS rank FROM `order` p, (SELECT @curRank := 0) r ORDER BY total desc ) as dt,(select count(distinct user_id) as cnt from `order`) as ct
order +-----------+----------+ | user_id | total | +-----------+----------+ | 1 | 30 | | 4 | 100 | | 3 | 200 | +-----------+----------+
percentiles +-----------+----------+---------+---------------+ | user_id | total | rank | percentile | +-----------+----------+---------+---------------+ | 1 | 30 | 3 | 33.33 | | 4 | 100 | 2 | 66.67 | | 3 | 200 | 1 | 100 | +-----------+----------+---------+---------------+
जैसा कि आप देख सकते हैं कि अंतिम रैंक वाले उपयोगकर्ता के पास शून्य प्रतिशतक नहीं है। यह प्रतिशतक गणना की प्रकृति है। या तो पहले व्यक्ति के पास 100 पर्सेंटाइल हो सकता है या अंतिम रैंक वाले के पास शून्य हो सकता है। दोनों एक साथ नहीं हो सकते। यदि आप अंतिम रैंक वाले व्यक्ति को शून्य पर्सेंटाइल के लिए बाध्य करना चाहते हैं, तो आप निम्नलिखित प्रश्नों का उपयोग कर सकते हैं। मैं पर्सेंटाइल की गणना करते समय रैंक में 1 नहीं जोड़ रहा हूं।
select user_id,total,rank,round(100*(cnt-rank)/cnt,0) as percentile from (SELECT user_id,total,@curRank := @curRank + 1 AS rank FROM (select user_id,sum(sales) as total from `order` group by user_id) p, (SELECT @curRank := 0) r ORDER BY total desc ) as dt,(select count(distinct user_id) as cnt from `order`) as ct
यदि आपके पास तालिका में प्रत्येक उपयोगकर्ता के लिए पहले से ही कुल बिक्री है और प्रतिशतक की गणना के लिए तालिका का सीधे उपयोग करना चाहते हैं, तो यहां एक क्वेरी है
select user_id,total,rank,round(100*(cnt-rank)/cnt,0) as percentile from (SELECT user_id,total,@curRank := @curRank + 1 AS rank FROM `order` p, (SELECT @curRank := 0) r ORDER BY total desc ) as dt,(select count(distinct user_id) as cnt from `order`) as ct
percentiles +-----------+----------+---------+---------------+ | user_id | total | rank | percentile | +-----------+----------+---------+---------------+ | 1 | 30 | 3 | 0 | | 4 | 100 | 2 | 33.33 | | 3 | 200 | 1 | 66.67 | +-----------+----------+---------+---------------+
नमूना तालिका क्रम बनाने के लिए SQL: