【问题标题】:Complicated mySQL Query Order By复杂的 mySQL 查询顺序
【发布时间】:2012-12-19 22:36:21
【问题描述】:

示例数据:

╔════╦════════════╦════════════╦═══════╦══════════ ═╦════════╗ ║ ID ║ 开始 ║ 停止 ║ 用户 ║ 文件 ║ 大小 ║ ╠════╬════════════╬════════════╬═══════╬══════════ ═╬════════╣ ║ 1 ║ 1330133409 ║ 1330133410 ║ user1 ║ file1.zip ║ 300000 ║ ║ 2 ║ 1330133409 ║ 1330133410 ║ user1 ║ file2.zip ║ 300500 ║ ║ 3 ║ 1330133409 ║ 1330133410 ║ user2 ║ file1.zip ║ 300000 ║ ║ 4 ║ 1330133409 ║ 1330133410 ║ user2 ║ file2.zip ║ 300500 ║ ║ 5 ║ 1330133409 ║ 1330133410 ║ user1 ║ file3.zip ║ 500000 ║ ║ 6 ║ 1330133409 ║ 1330133310 ║ user6 ║ file3.zip ║ 500000 ║ ╚════╩════════════╩════════════╩═══════╩══════════ ═╩════════╝

我需要创建一个 MySQL 查询来计算 PER_USER_AVERAGE_BANDWIDTH where PER_USER_AVERAGE_BANDWIDTH = SUM(SIZE) / (STOP - START),然后按 PER_USER_AVERAGE_BANDWIDTH 排序以产生如下结果:

╔═══════╦════════════════════════════╗ ║ 用户 ║ PER_USER_AVERAGE_BANDWIDTH ║ ╠═══════╬════════════════════════════╣ ║ 用户3 ║ 110.37 ║ ║ 用户 1 ║ 100.25 ║ ║ 用户 2 ║ 75.70 ║ ╚═══════╩════════════════════════════╝

一清二楚;)有人吗?

【问题讨论】:

  • +1 为可爱的布局。自从 Paradox for Dos 2.0 以来还没有见过这种东西
  • 您显示user1user2user6 的数据 - 结果集中的user3 来自哪里?另外,您如何SUM(SIZE)(多行)但在(STOP - START) 中只使用一行? user1 共有三行 - 您希望哪一行用于计算的那部分? (是的,我意识到在这种情况下 STOPSTART 对于所有三行都是相同的值,但是数据库在解析 SQL 时并不知道。)
  • @TonyHopkinson:那应该是我的 +1!悲伤的脸;)仅供参考sensefulsolutions.com/2010/10/format-text-as-table.html
  • @eggyal,+ 1 以确保您获得荣誉。 :)

标签: mysql


【解决方案1】:

我认为你的平均值应该是总大小与总持续时间,按用户分组:

SELECT   USER,
         SUM(SIZE) / SUM(STOP - START) AS PER_USER_AVERAGE_BANDWIDTH
FROM     my_table
GROUP BY USER
ORDER BY PER_USER_AVERAGE_BANDWIDTH DESC

sqlfiddle 上查看。

【讨论】:

  • 这不是一个平均值。它是总带宽。不同的东西。使用铅笔和纸,你会得到它。
  • @Bohemian:肯定是平均水平。想象一下 100 次传输,其中一个 1GiB 超过 1 秒,另外 99 个 1B 超过 1000 秒;我计算总传输量 (1.00000009GiB) 并除以总持续时间 (99001s) 得出 84.7kbps 的(加权)平均吞吐量。相比之下,Rufo 爵士的回答得出的未加权平均值为 81.9Mbps。
  • 我将此问题解释为要求“正常”(即未加权)平均值。您给出的加权平均值的答案也可能是一个合理的解释。两者都是有效且有用的统计数据。我认为正常平均值更有用,因为碰巧是竞价下载的一次糟糕的下载体验不会比小文件的 99 次良好的下载体验。
  • @Bohemian:恰恰相反,反之亦然。在我上面给出的示例中,有 1 次出色的下载体验(8Gbps),然后是 99 次糟糕的下载体验(0.008bps) .未加权平均值产生了相当不错的 81.9Mbps,与加权平均值 84.7kbps 相比,它更少考虑更常见的糟糕下载体验!
【解决方案2】:

直接平均

SELECT 
  `user`,
  AVG( size / ( stop - start ) ) per_user_average_bandwidth
FROM
  tab_dl
GROUP BY `user`
ORDER BY per_user_average_bandwidth DESC

SQL Fiddle DEMO

【讨论】:

【解决方案3】:

这个查询应该这样做:

SELECT USER, (SUM(SIZE) / (STOP - START)) AS PER_USER_AVERAGE_BANDWIDTH
FROM table
GROUP BY USER, stop, start
ORDER BY PER_USER_AVERAGE_BANDWIDTH DESC

这将为您提供每个用户在每个唯一时间范围内的平均带宽(即,如果用户在时间 1 和时间 5 之间下载文件 1 和文件 2 以及在时间 1 和时间 10 之间下载文件 3,您将获得 2 行) .

【讨论】:

  • 这根本没有回答问题 - 请参阅 sqlfiddle.com/#!2/df2e0/5/0 - btw GROUP BY ID, start, stop with unique ID 就像 GROUP BY ID ;o)
  • 我可能不清楚。差不多好了。应该是该用户下载的所有文件的每个用户的平均带宽。因此,每个用户一个结果。
  • @SirRufo 这是在编辑问题之前遗留下来的,我最初在列清晰之前更新了我的答案。
  • @DanielAbrams 假设每个用户只有一个时间段,否则计算将不正确。
猜你喜欢
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多