Подтвердить что ты не робот

Сложный порядок запросов mySQL

Пример данных:

╔════╦════════════╦════════════╦═══════╦═══════════╦════════╗
║ ID ║   START    ║    STOP    ║ USER  ║   FILE    ║  SIZE  ║
╠════╬════════════╬════════════╬═══════╬═══════════╬════════╣
║  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 где PER_USER_AVERAGE_BANDWIDTH = SUM(SIZE) / (STOP - START), а затем заказывает PER_USER_AVERAGE_BANDWIDTH для создания таких результатов:

╔═══════╦════════════════════════════╗
║ USER  ║ PER_USER_AVERAGE_BANDWIDTH ║
╠═══════╬════════════════════════════╣
║ user3 ║ 110.37                     ║
║ user1 ║ 100.25                     ║
║ user2 ║ 75.70                      ║
╚═══════╩════════════════════════════╝

Очистить как грязь;) Кто-нибудь?

4b9b3361

Ответ 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.

Ответ 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

Это даст вам среднюю пропускную способность для каждого пользователя за уникальный период времени (то есть вы получите 2 строки для пользователя, если они загружают файл 1 и файл 2 между временем 1 и временем 5 и файлом 3 между временем 1 и временем 10).