0

我有一个名为的 SQL 表main_table

编号 | 产品编号 | 购买ID | 购买者 ID
---+------------+-------------+-------------
 1 | 1 | 1 | 1
 2 | 1 | 2 | 1
 3 | 1 | 3 | 1
 4 | 1 | 4 | 2
 5 | 1 | 5 | 2
 6 | 1 | 6 | 3
 7 | 2 | 1 | 1
 8 | 2 | 4 | 2
 9 | 2 | 5 | 2
10 | 2 | 7 | 2
11 | 2 | 8 | 2
12 | 2 | 6 | 3
13 | 2 | 9 | 3
14 | 2 | 10 | 3
15 | 2 | 11 | 3
16 | 2 | 12 | 4
17 | 2 | 13 | 4

我需要分组product_id并找到四件事:

  • # 购买
  • #购买者
  • #重复购买
  • #重复购买者

所以前3个比较简单...

SELECT FROM `main_table`
  product_id,
  COUNT(DISTINCT `purchase_id`) AS `purchases`,
  COUNT(DISTINCT `purchaser_id`) AS `purchasers`,
  (COUNT(DISTINCT `purchase_id`) - COUNT(DISTINCT `purchaser_id`)) AS `repeat_purchases`,
  (??????) AS `repeat_purchasers`
GROUP BY product_id
ORDER BY product_id ASC

什么是??????为了得到下表:

product_id | purchases | purchasers | repeat_purchases | repeat_purchasers
-----------+-----------+------------+------------------+------------------
         1 |         6 |          3 |                3 |                2 
         2 |        11 |          4 |                7 |                3 
4

2 回答 2

2
SELECT  a.product_id,
        COUNT(DISTINCT a.purchase_id) AS purchases,
        COUNT(DISTINCT a.purchaser_id) AS purchasers,
        (COUNT(DISTINCT a.purchase_id) - COUNT(DISTINCT a.purchaser_id)) AS repeat_purchases,
        COALESCE(c.totalCount,0) AS repeat_purchasers
FROM    main_table a
        LEFT JOIN
        (
            SELECT  product_id, COUNT(totalCOunt) totalCount
            FROM    
                    (
                        SELECT  product_id, purchaser_id, COUNT(*) totalCOunt
                        FROM    main_table
                        GROUP   BY product_id, purchaser_id
                        HAVING  COUNT(*) > 1
                    ) s
            GROUP   BY product_id
        ) c ON  a.product_id = c.product_id
GROUP   BY product_id

输出

╔════════════╦═══════════╦════════════╦══════════════════╦═══════════════════╗
║ PRODUCT_ID ║ PURCHASES ║ PURCHASERS ║ REPEAT_PURCHASES ║ REPEAT_PURCHASERS ║
╠════════════╬═══════════╬════════════╬══════════════════╬═══════════════════╣
║          1 ║         6 ║          3 ║                3 ║                 2 ║
║          2 ║        11 ║          4 ║                7 ║                 3 ║
╚════════════╩═══════════╩════════════╩══════════════════╩═══════════════════╝
于 2013-05-02T05:57:52.190 回答
0

我会做这样的事情:

select a.product_id, count(*) as purchases, count(distinct(a.purchaser_id)) as 
purchasers, count(*) - count(distinct(a.purchaser_id)) as repeat_purchases, 
b.repeat_purchasers from main_table a, 
(select x.product_id, count(*) as repeat_purchasers from 
   (select y.product_id, y.purchaser_id from main_table y 
    group by y.purchaser_id, y.product_id having y.count > 1) x 
 group by x.product_id) b group by
a.product_id,b.repeat_purchasers,b.product_id having 
a.product_id = b.product_id`

这与 John 的基本相同,但没有 JOIN

于 2018-02-01T15:28:20.480 回答