sql >> Database >  >> RDS >> Mysql

Hoe procent berekenen?

Als u de verhouding wilt tussen gebruikers die betalingen hebben gedaan en gebruikers met activiteit, vat u elke tabel afzonderlijk samen:

select p.cnt / a.cnt
from (select count(distinct user_id) as cnt from activity a) a cross join
     (select count(distinct user_id) as cnt from payment) p;

BEWERKEN:

Je hebt een tabel nodig met alle datums in het bereik. Dat is het grootste probleem.

Dan zou ik aanraden:

SELECT d.dte,
       ( ( SELECT COUNT(DISTINCT p.user_id)
           FROM payments p
           WHERE p.payment_date >= d.dte and p.payment_date < d.dte + INTERVAL 1 DAY
          ) /
          NULLIF( (SELECT COUNT(DISTINCT a.user_id)
                   FROM activity a
                   WHERE a.login_time >= d.dte and p.login_time < d.dte + INTERVAL 1 DAY
                  ), 0
                 ) as ratio
FROM (SELECT date('2017-01-01') dte UNION ALL
      SELECT date('2017-01-02') dte UNION ALL
      SELECT date('2017-01-03') dte UNION ALL
      SELECT date('2017-01-04') dte UNION ALL
      SELECT date('2017-01-05') dte 
     ) d;

Opmerkingen:

  • Dit retourneert NULL op dagen dat er geen activiteit is. Dat lijkt me logischer dan 0 .
  • Dit gebruikt logica voor de datums die werkt voor zowel datums als datum/tijd-waarden.
  • De logica voor datums kan gebruik maken van een index, wat belangrijk kan zijn voor dit type zoekopdracht.
  • Ik raad het gebruik van LEFT JOIN af s. Dat zal de gegevens vermenigvuldigen die de zoekopdracht duur kunnen maken.


  1. Hoe u uw MySQL- en MariaDB-database kunt beschermen tegen cyberaanvallen op een openbaar netwerk

  2. base64-codering in MySQL

  3. Multi-tenant Django-applicaties:databaseverbinding per aanvraag wijzigen?

  4. Hoe Spring Boot te gebruiken met MySQL-database en JPA?