我正在使用 MySQL 数据库。以下 SQL 查询对包含 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 号,但第二列中的价格不同。
最佳答案
使用 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
关于mysql - SQL:从相邻行获取模式(统计信息),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25984088/