SQL:从相邻行获取模式(统计信息)

时间:2014-09-22 22:33:24

标签: mysql sql

我正在使用MySQL数据库。以下SQL query计算包含有关ID产品信息的所有行:

select subquery1.ID_PRODUCT,
count(*) as 'COUNT'
from (SELECT id_product as 'ID_PROD'
FROM product_prices) as subquery1
group by subquery1.ID_PROD
order by 'COUNT' DESC

因此,结果左侧的产品ID和引用此产品的总行数如下:

ID_PROD| COUNT
_______________
'1'    | '3623'
'2'    | '1669'
'3'    | '6665'
'4'    | '3703'
'5'    | '638'
'6'    | '4322'
'7'    | '545'
'8'    | '5481'
'9'    | '82'
'10'   | '1092'

此表包含不同商店中每种商品的不同价格,因此我需要获取模式(最常见的价值)。因此,如果10美元的产品价格13美元在1092行中重复最多,那么13美元就是模式。我已经使用下一个SQL完成了这个:

(SELECT retail_price FROM product_prices
GROUP BY retail_price
HAVING count(*) >= all (SELECT count(*)
                        FROM product_prices
                        GROUP BY retail_price)) as 'MODE'

添加到上一个select的子查询获取所有产品的模式值,或者我可以使用where语句获取特定产品的模式,但是这个模式列填充了相同的所有行的值如下:

ID_PROD| COUNT  | MODE
_____________________
'1'    | '3623' | 55
'2'    | '1669' | 55
'3'    | '6665' | 55
'4'    | '3703' | 55
'5'    | '638'  | 55
'6'    | '4322' | 55
'7'    | '545'  | 55
'8'    | '5481' | 55
'9'    | '82'   | 55
'10'   | '1092' | 55

我想获取每个产品的模式值,而不是全局模式值。这就是我想要的:

ID_PROD| COUNT  | MODE
_____________________
'1'    | '3623' | 16
'2'    | '1669' | 22
'3'    | '6665' | 34
'4'    | '3703' | 10
'5'    | '638'  | 24
'6'    | '4322' | 48
'7'    | '545'  | 55
'8'    | '5481' | 145
'9'    | '82'   | 287
'10'   | '1092' | 32

有人可以帮帮我吗?提前致谢!!!


编辑:

product_prices表的数据类似于:

id_product | retail_price 
__________________________
'1'        | '15'
'1'        | '23'
'1'        | '18'
'2'        | '45'
'2'        | '42'
'3'        | '44'
'3'        | '40'
'3'        | '44'
'3'        | '39'
'4'        | '8'
'5'        | '16'
'5'        | '16'
'5'        | '14'

该表没有很多其他数据,只有几列,但查询不需要它们。因此,我们有许多行具有相同的ID号,第二列中的价格不同。感谢。

1 个答案:

答案 0 :(得分:0)

使用mysql计算模式不是一项简单的任务。这是一个首先计算每个组的选项,然后获取每个id的最大计数,然后将这些结果连接回原始查询:

SELECT pp.id_product, pp.retail_price, count(*) cnt
FROM product_prices pp
  JOIN 
    (
      SELECT id_product, MAX(cnt) cnt
      FROM (
        SELECT id_product, retail_price, count(*) cnt
        FROM product_prices 
        GROUP BY id_product, retail_price
      ) t
      GROUP BY id_product
    ) pp2 ON pp.id_product = pp2.id_product 
GROUP BY pp.id_product, pp.retail_price, pp2.cnt
HAVING COUNT(*) = pp2.cnt