Сложный порядок запросов 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 ║
╚═══════╩════════════════════════════╝
Очистить как грязь;) Кто-нибудь?
Ответы
Ответ 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).