Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Berechnen Sie das Perzentil aus der Häufigkeit in MySQL

Manchmal möchten Sie vielleicht das Perzentil aus der Häufigkeit oder Anzahl in MySQL basierend auf berechnen. Zum Beispiel, um Kunden nach Anzahl der Käufe oder Bestellungen statt nach Gesamtumsatz zu ordnen. Es gibt noch keine Funktionen dafür. Hier ist eine fertige Abfrage dafür.

Beispiel:Sie haben einen Tisch Bestellungen die alle Produktbestellungen für jeden Benutzer enthält. Sie möchten das Perzentil aus der Häufigkeit der Bestellungen berechnen.

order+------+--------------+-------------+| Benutzer-ID | Produkt | Verkäufe |+-----------+------------+----------+| 1 | Seife | 10 || 4 | Parfüm | 100 || 1 | Nudeln | 20 || 4 | Seife | 10 || 1 | Kleber | 20 || 3 | Deo | 200 |+-----------+------------+----------+
Perzentile+-----------+----------+---------+------------- --+| Benutzer-ID | insgesamt | Rang | Perzentil |+-----------+----------+---------+-------------- -+| 1 | 3 | 1 | 100 || 4 | 2 | 2 | 66,67 || 3 | 1 | 3 | 33.33 |+-----------+----------+---------+-------------- -+

Hier ist eine Abfrage, die Sie verwenden können, um das Perzentil aus der Häufigkeit oder der Anzahl in MySQL zu berechnen. Ersetzen Sie einfach die Spalten – user_id, sales und table – order. Es zählt die Anzahl der Bestellungen für jeden Benutzer. Dann ordnet es sie nach der Anzahl der Bestellungen. Schließlich wird das Perzentil anhand des Rangs berechnet.

wählen Sie user_id aus  ,total,rank,round(100*(cnt-rank+1)/cnt,0) als Perzentil von (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM (select user_id  ,count(Verkäufe  ) als Summe aus `Bestellung  ` nach user_id gruppieren  )p, (SELECT @curRank :=0) rORDER BY total desc ) as dt,(select count(distinct user_id  ) als cnt from`order  `) als ct

Wenn Sie bereits die Anzahl der Bestellungen für jeden Benutzer in der Tabelle haben und die Tabelle direkt verwenden möchten, um das Perzentil aus der Häufigkeit oder Anzahl zu berechnen, ist hier eine Abfrage

wählen Sie user_id aus  ,total,rank,round(100*(cnt-rank+1)/cnt,0) als Perzentil von (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM `order`  p, (SELECT @curRank :=0) rORDER BY total desc ) as dt,(select count(distinct user_id  ) als cnt from`order  `) als ct
Perzentile+-----------+----------+---------+------------- --+| Benutzer-ID | insgesamt | Rang | Perzentil |+-----------+----------+---------+-------------- -+| 1 | 3 | 1 | 100 || 4 | 2 | 2 | 66,67 || 3 | 1 | 3 | 33.33 |+-----------+----------+---------+-------------- -+

Wie Sie sehen können, hat der zuletzt eingestufte Benutzer kein Nullperzentil. Dies ist die Art der Perzentilberechnung. Entweder die erste Person kann 100 Perzentil haben oder die letzte Person kann null haben. Beides kann nicht gleichzeitig passieren. Wenn Sie die letzte eingestufte Person zwingen möchten, ein Nullperzentil zu haben, können Sie die folgenden Abfragen verwenden. Ich füge beim Berechnen des Perzentils keine 1 zum Rang hinzu.

wählen Sie user_id aus  ,total,rank,round(100*(cnt-rank)/cnt,0) als Perzentil von (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM (select user_id  ,count(Verkäufe  ) als Summe aus `Bestellung  ` nach user_id gruppieren  )p, (SELECT @curRank :=0) rORDER BY total desc ) as dt,(select count(distinct user_id  ) als cnt from`order  `) als ct

Wenn Sie bereits Gesamtverkäufe für jeden Benutzer in der Tabelle haben und die Tabelle direkt zur Berechnung des Perzentils verwenden möchten, ist hier eine Abfrage

wählen Sie user_id aus  ,total,rank,round(100*(cnt-rank)/cnt,0) als Perzentil von (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM `order`  p, (SELECT @curRank :=0) rORDER BY total desc ) as dt,(select count(distinct user_id  ) als cnt from`order  `) als ct
Perzentile+-----------+----------+---------+------------- --+| Benutzer-ID | insgesamt | Rang | Perzentil |+-----------+----------+---------+-------------- -+| 1 | 3 | 1 | 66,67 || 4 | 2 | 2 | 33.33 || 3 | 1 | 3 | 0 |+-----------+----------+---------+-------------- -+

SQL zum Erstellen der Beispieltabellenreihenfolge: