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

अगले दिन फिर से खेले गए प्रतिशत की गणना

मान लें कि तालिका परिभाषा में यह ठोस कोर है:

CREATE TABLE game_table (
  user_id   bigint NOT NULL
, date      date   NOT NULL  -- date, not text!
, game_name text   NOT NULL
, UNIQUE (date, game_name, user_id)  -- !
);

और यह मानते हुए कि आपका मतलब वही खिलाड़ी है जो अगले दिन वही खेल खेल रहा है:

SELECT round(ct_day2 * 100.0 / ct_day1, 2) AS repeat_percentage
FROM  (
   SELECT count(*) AS ct_day1
        , count(d2.user_id) AS ct_day2
   FROM   instant_game_sessions d1
   LEFT   JOIN instant_game_sessions d2 ON (d2.user_id, d2.game_name, d2.date)
                                         = (d1.user_id, d1.game_name, d1.date + 1)
   WHERE  d1.date = '2021-01-07'
   AND    d1.game_name = 'Chess'
   ) sub;

UNIQUE बाधा यह सुनिश्चित करती है कि अगले दिन केवल एक ही मैच हो। तो count(*) दिन 1 के लिए सही गणना है, और count(d2.user_id) दिन 2 के लिए। बाकी स्पष्ट है।

UNIQUE बाधा (इस क्रम में कॉलम नामों के साथ!) क्वेरी के लिए सही अनुक्रमणिका भी प्रदान करती है। देखें:

ध्यान दें कि संख्यात्मक स्थिरांक 100.0 डिफ़ॉल्ट रूप से संख्यात्मक रूप से स्वचालित रूप से, इसलिए हमें कोई स्पष्ट प्रकार का कास्ट जोड़ने की आवश्यकता नहीं है। संबंधित:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. चयन के लिए लॉक करें ताकि दूसरी प्रक्रिया को पुराना डेटा न मिले

  2. एक पैरामीटर पूछें (postgresql.conf सेटिंग) जैसे max_connections

  3. @Tailable(spring-data-reactive-mongodb) स्प्रिंग-डेटा-r2dbc के बराबर

  4. मैं पीएल/पीजीएसक्यूएल में नेस्टेड फ़ंक्शन कैसे बना सकता हूं?

  5. हाइबरनेट में PostgreSQL अंतराल कॉलम प्रकार को कैसे मैप करें?