Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL में आवृत्ति से पर्सेंटाइल की गणना करें

कभी-कभी आप आवृत्ति से प्रतिशतक की गणना करना चाहते हैं या MySQL में गणना के आधार पर गणना कर सकते हैं। उदाहरण के लिए, कुल बिक्री के बजाय खरीद या ऑर्डर की संख्या के आधार पर ग्राहकों को रैंक करना। इसके लिए अभी तक कोई कार्य नहीं है। इसे करने के लिए तैयार प्रश्न है।

उदाहरण के लिए, आपके पास एक टेबल है आदेश जिसमें प्रत्येक उपयोगकर्ता के लिए सभी उत्पाद ऑर्डर शामिल हैं। आप ऑर्डर की आवृत्ति से पर्सेंटाइल की गणना करना चाहते हैं।

order
+------+--------------+-------------+
|  user_id  |   product  |   sales  |
+-----------+------------+----------+
|     1     |     Soap   |    10    |
|     4     |   Perfume  |   100    |
|     1     |   Noodles  |   20     |
|     4     |     Soap   |   10     |
|     1     |    Glue    |   20     |
|     3     |     Deo    |   200    |
+-----------+------------+----------+
percentiles
+-----------+----------+---------+---------------+
|  user_id  |   total  |  rank   |   percentile  |
+-----------+----------+---------+---------------+
|     1     |     3    |    1    |      100      |
|     4     |     2    |    2    |     66.67     |
|     3     |     1    |    3    |     33.33     |
+-----------+----------+---------+---------------+

यहां एक क्वेरी है जिसका उपयोग आप आवृत्ति से प्रतिशतक की गणना करने के लिए कर सकते हैं या 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,count(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     |    3     |
|     4     |    2     |
|     3     |    1     |
+-----------+----------+
percentiles
+-----------+----------+---------+---------------+
|  user_id  |   total  |  rank   |   percentile  |
+-----------+----------+---------+---------------+
|     1     |     3    |    1    |      100      |
|     4     |     2    |    2    |     66.67     |
|     3     |     1    |    3    |     33.33     |
+-----------+----------+---------+---------------+

जैसा कि आप देख सकते हैं कि अंतिम रैंक वाले उपयोगकर्ता के पास शून्य प्रतिशतक नहीं है। यह प्रतिशतक गणना की प्रकृति है। या तो पहले व्यक्ति के पास 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,count(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     |    3     |    1    |     66.67     |
|     4     |    2     |    2    |     33.33     |
|     3     |    1     |    3    |       0       |
+-----------+----------+---------+---------------+

नमूना तालिका क्रम बनाने के लिए SQL:

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्ट php mysql . के लिए कीवर्ड विभाजित करें

  2. एक MySQL तालिका में डालें या मौजूद होने पर अपडेट करें

  3. Howto:एक mysql InnoDB स्टोरेज इंजन को साफ करें?

  4. MySQL में MIN() बनाम LEAST():क्या अंतर है?

  5. जावा का उपयोग कर डेटाबेस कनेक्शन में MySQL टाइमज़ोन कैसे बदलें?