【问题标题】:Calculate mean number of rows per item per month in MySQL计算MySQL中每个项目每月的平均行数
【发布时间】:2013-09-06 13:52:48
【问题描述】:

我很难找到一种清晰、通用的方式来表达这个问题,如果重复了,我深表歉意。情况如下:

我有一个记录协作标记数据的表格,每一行都存储一个注释(即特定用户在特定时间用特定标签标记特定项目)。为了清楚起见,这里有一个示例:

+---------+---------+--------+------------+
| user_id | item_id | tag_id | tag_month  |
+---------+---------+--------+------------+
| 1040740 |    2653 |   1344 | 2005-07-01 |
| 1040740 |    3602 |   1344 | 2005-07-01 |
| 1040740 |   17746 |    217 | 2005-07-01 |
| 1040740 |   21426 |   1344 | 2005-07-01 |
| 1040740 |   22224 |    180 | 2005-07-01 |
+---------+---------+--------+------------+

...等等。我要逐月计算的是所有项目中每个项目的平均注释数。换句话说,对于每个月,该月每个唯一项目的平均行数是多少?我的数据集总共跨越 94 个月,因此我想要的查询的输出应该是 94 行,每行都有该月每个项目的平均注释数。请注意,“user_id”列与此完全无关。

【问题讨论】:

  • 即使该项目在该月的注释为零,是否所有内容都需要 94 行?
  • 所以每一行都将具有完全相同的数字(所有项目组合的平均值)或只是该特定项目的平均值(这将只是该 item_id 的计数)?

标签: mysql


【解决方案1】:

我认为你只需要做相应的 COUNT:

SELECT 
  COUNT(DISTINCT item_id),
  YEAR(tag_month),
  MONTH(tag_month)
FROM
  t
GROUP BY
  YEAR(tag_month),
  MONTH(tag_month)

不确定您是否想获得item_id,但是,如果您需要,那么:

SELECT 
  COUNT(1),
  item_id,
  YEAR(tag_month),
  MONTH(tag_month)
FROM
  t
GROUP BY
  item_id,
  YEAR(tag_month),
  MONTH(tag_month)

【讨论】:

  • 这是一个与此相关的 SQLFiddle(假设他只想要每个项目的个人平均值,在这种情况下计算):sqlfiddle.com/#!2/f15871/4
  • "COUNT(DISTINCT item_id)" 给出受影响的项目数。 "COUNT(*) / COUNT(DISTINCT item_id)" 将给出当月每个项目的平均标签数。
  • 改为接受@gwc 的回答,因为这给出了计数而不是平均值。
【解决方案2】:

Alma Do Mundo 给出的每个月平均标签数量的回答略有偏差。

SELECT 
  COUNT(*) / COUNT(DISTINCT item_id) as tag_average,
  YEAR(tag_month),
  MONTH(tag_month)
FROM
  t
GROUP BY
  YEAR(tag_month),
  MONTH(tag_month)

【讨论】:

  • 这正是我所需要的。没有说清楚,但是没有必要按年和月分成列,因为数据已经被分成几个月(即查询功能对我来说非常完美:“SELECT COUNT(*) / COUNT(DISTINCT item_id) as tag_average, tag_month FROM t GROUP BY tag_month"。
  • 因为示例数据包括月份中的某一天,我(我想@Alma Do Mundo)不确定 tag_month 是否仅代表一年和一个月。无论如何,很高兴它有效。 Alma Do Mundo 的成功值得称赞。
猜你喜欢
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多