sql >> Databasteknik >  >> RDS >> Mysql

Hur räknar man ut procent?

Om du vill ha förhållandet mellan användare som har gjort betalningar och de med aktivitet, sammanfatta bara varje tabell individuellt:

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;

EDIT:

Du behöver en tabell med alla datum i intervallet. Det är det största problemet.

Då skulle jag rekommendera:

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;

Anmärkningar:

  • Detta returnerar NULL på dagar då det inte är någon aktivitet. Det är mer vettigt för mig än 0 .
  • Detta använder logik för datumen som fungerar för både datum och datum/tidsvärden.
  • Logiken för datum kan använda ett index, vilket kan vara viktigt för den här typen av fråga.
  • Jag rekommenderar inte att du använder LEFT JOIN s. Det kommer att multiplicera data vilket kan göra frågan dyr.


  1. Hur genererar man en dynamisk sekvenstabell i MySQL?

  2. Hur kan jag kombinera flera rader till en kommaavgränsad lista i SQL Server 2005?

  3. Bästa typen av indexering när det finns LIKE-klausul

  4. Bästa sättet att lagra IP i databasen?