Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tính toán phần trăm từ lần truy cập gần đây trong MySQL

Đôi khi bạn có thể muốn tính toán phần trăm từ lần truy cập gần đây trong MySQL dựa trên. Ví dụ:để xếp hạng khách hàng dựa trên lần mua hàng hoặc đơn đặt hàng gần đây thay vì tổng doanh số. Điều này giúp tạo ưu đãi đặc biệt cho những người gần đây đã mua thứ gì đó trên trang web của bạn. Chưa có chức năng nào cho nó. Đây là một truy vấn được tạo sẵn để thực hiện.

Ví dụ:Bạn có một bảng đơn đặt hàng trong đó chứa tất cả các đơn đặt hàng sản phẩm cho mỗi người dùng. Bạn muốn tính toán phần trăm từ lần truy cập gần đây của các đơn đặt hàng.

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     |
+-----------+----------------+---------+---------------+

Đây là một truy vấn bạn có thể sử dụng để tính toán phần trăm từ lần truy cập gần đây trong MySQL. Chỉ cần thay thế các cột - user_id, buy_date và table - order. Nó có ngày mua mới nhất cho mỗi người dùng. Sau đó, nó xếp hạng chúng vào ngày mua mới nhất. Cuối cùng, nó tính toán phần trăm bằng cách sử dụng xếp hạng.

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

Nếu bạn đã có ngày mua hàng gần đây nhất cho từng người dùng trong bảng và muốn trực tiếp sử dụng bảng để tính phần trăm từ lần mua hàng gần đây, đây là một truy vấn

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     |
+-----------+----------------+---------+---------------+

Như bạn có thể thấy, người dùng được xếp hạng cuối cùng không có phân vị bằng không. Đây là bản chất của tính toán phần trăm. Người đầu tiên có thể có 100 phần trăm hoặc người xếp hạng cuối cùng có thể có số không. Cả hai không thể xảy ra cùng một lúc. Nếu bạn muốn buộc người được xếp hạng cuối cùng có phân vị bằng 0, bạn có thể sử dụng các truy vấn sau. Tôi không thêm 1 vào thứ hạng trong khi tính toán phần trăm.

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

Nếu bạn đã có tổng doanh số bán hàng cho mỗi người dùng trong bảng và muốn trực tiếp sử dụng bảng để tính phần trăm, đây là một truy vấn

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 để tạo thứ tự bảng mẫu:

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hướng dẫn sử dụng MySQL - Hiểu được những giây đằng sau giá trị chính

  2. Tìm kiếm văn bản trong các trường trong mỗi bảng của cơ sở dữ liệu MySQL

  3. Sự khác biệt giữa hai cách tiếp cận bảng nối này?

  4. Cách lấy ngày hiện tại trong MySQL

  5. Trong MySQL, tôi có thể trì hoãn kiểm tra tính toàn vẹn tham chiếu cho đến khi cam kết không