在MySql中的组内计算不同的重复项

时间:2013-05-02 05:48:50

标签: mysql sql group-by distinct having

我有一个名为main_table的SQL表:

id | product_id | purchase_id | purchaser_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分组并找到四件事:

  • #products
  • #coresrs
  • #wreite purchase
  • #repely purchasers

所以前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 

2 个答案:

答案 0 :(得分: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 ║
╚════════════╩═══════════╩════════════╩══════════════════╩═══════════════════╝

答案 1 :(得分: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