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

MySQL में रीसेंसी से पर्सेंटाइल की गणना करें

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

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

order
+-----------+------------+------------------+
|  user_id  |   product  |   purchase_date  |
+-----------+------------+------------------+
|     1     |     Soap   |     2013-11-20   |
|     4     |   Perfume  |     2013-07-02   |
|     1     |   Noodles  |     2013-10-20   |
|     4     |     Soap   |     2013-11-11   |
|     1     |    Glue    |     2013-09-12   |
|     3     |     Deo    |     2013-10-20   |
+-----------+------------+------------------+
percentiles
+-----------+----------------+---------+---------------+
|  user_id  |   latest       |  rank   |   percentile  |
+-----------+----------------+---------+---------------+
|     1     |  2013-11-20    |    1    |      100      |
|     4     |  2013-11-11    |    2    |     66.67     |
|     3     |  2013-10-20    |    3    |     33.33     |
+-----------+----------------+---------+---------------+

यहां एक क्वेरी है जिसका उपयोग आप MySQL में रीसेंसी से पर्सेंटाइल की गणना करने के लिए कर सकते हैं। बस कॉलम को बदलें - user_id, buy_date और टेबल - ऑर्डर। यह प्रत्येक उपयोगकर्ता को नवीनतम खरीद तिथि प्राप्त करता है। फिर यह उन्हें खरीद की नवीनतम ओवर डेट पर रैंक करता है। अंत में, यह रैंक का उपयोग करके पर्सेंटाइल की गणना करता है।

select user_id,latest,rank,round(100*(cnt-rank+1)/cnt,0) as percentile from   
(SELECT  user_id,latest,@curRank := @curRank + 1 AS rank
FROM      (select user_id,max(purchase_date) as latest from `order` group by user_id)
p, (SELECT @curRank := 0) r
ORDER BY  latest desc ) as dt,(select count(distinct user_id) as cnt from
`order`) as ct

यदि आपके पास पहले से ही तालिका में प्रत्येक उपयोगकर्ता के लिए नवीनतम खरीद तिथि है और आप खरीद की पुनरावृत्ति से प्रतिशतक की गणना करने के लिए सीधे तालिका का उपयोग करना चाहते हैं, तो यहां एक प्रश्न है

select user_id,purchase_date,rank,round(100*(cnt-rank+1)/cnt,0) as percentile from   
(SELECT  user_id,purchase_date,@curRank := @curRank + 1 AS rank
FROM   `order`
p, (SELECT @curRank := 0) r
ORDER BY  purchase_date desc ) as dt,(select count(distinct user_id) as cnt from
`order`) as ct
order
+-----------+----------------+---------+---------------+
|  user_id  |   purchase_date|  rank   |   percentile  |
+-----------+----------------+---------+---------------+
|     1     |  2013-11-20    |    1    |      100      |
|     4     |  2013-11-11    |    2    |     66.67     |
|     3     |  2013-10-20    |    3    |     33.33     |
+-----------+----------------+---------+---------------+
percentiles
+-----------+----------------+---------+---------------+
|  user_id  |   purchase_date|  rank   |   percentile  |
+-----------+----------------+---------+---------------+
|     1     |  2013-11-20    |    1    |      100      |
|     4     |  2013-11-11    |    2    |     66.67     |
|     3     |  2013-10-20    |    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  |   purchase_date|  rank   |   percentile  |
+-----------+----------------+---------+---------------+
|     1     |  2013-11-20    |    1    |     66.67     |
|     4     |  2013-11-11    |    2    |     33.33     |
|     3     |  2013-10-20    |    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 API को मिला सकता हूँ?

  2. MySQL पसंदीदा इंजन - MyISAM या InnoDB

  3. MySQL में Null Values ​​की तुलना कैसे करें

  4. SQL DELETE के साथ WHERE कंडीशन के लिए एक और टेबल में शामिल हों

  5. असफल प्रविष्टियों पर MySQL ऑटोइनक्रिकमेंट क्यों बढ़ता है?