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

标签 mysql sql

我正在使用 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/

相关文章:

python - 在 Windows 10 上使用 django 连接到远程 mysql

mysql - 当新客户与回访客户 SQL 中的日期范围发生更改时删除重复项

php - 如何使我的 SQL 查询按以关键字开头的名称排序?

java - HIbernate 查询语言错误

python - Flask-SQLAlchemy 声明式和 MySQL 特定数据类型

mysql - utf8 和 utf8_general_ci

mysql - MySQL 功能存在问题

php - 拉维尔 : saving date to MySQL

mysql - 通过 mysql workbench 将 csv 导入表时的整数值不正确

mysql - 在 "in"运算符上指定表列