|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
31.01.2012, 06:20 | #1 |
Регистрация: 05.11.2011
Сообщений: 7
|
Вывести top сумм с сортировкой, возможно ли в принципе?
Здравствуйте!
Скажите, пожалуйста, данную задачу как-то можно реализовать посредством SQL одним запросом? Платформа MSSQL 2005. Задача следующая - "Из таблицы Интернет-статистики пользователей выводить по N самых больших сайта" В таблице с трафиком пользователей поля login,bytesin,bytesout, пользователей тысячи. Хочется получить хитрый запрос, который выдаст сразу по всем пользователям по три top сайта user1 url, sum(bytesin+bytesout) as mb (самый "толстый" сайт) user1 url, sum(bytesin+bytesout) as mb (поменьше) user1 url, sum(bytesin+bytesout) as mb (ещё меньше) user2 url, sum(bytesin+bytesout) as mb (самый "толстый" сайт) user2 url, sum(bytesin+bytesout) as mb (поменьше) user2 url, sum(bytesin+bytesout) as mb (ещё меньше) user3 url, sum(bytesin+bytesout) as mb (самый "толстый" сайт) итд Нашел несколько обсуждений, где выводятся не суммы, а просто самые большие элементы. Это, вроде, намного проще. Или хочу невозможного? Сейчас на каждого пользователя посредством asp дергаю отдельный sql-запрос. Работает не очень быстро. |
31.01.2012, 08:55 | #2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Хм... А если пойти от простого?
Код:
Не проверял но имеется ввиду идея группировки с отсеиванием элемента группы, если его "толщина" менее Максимума-Коэффициент
I'm learning to live...
|
31.01.2012, 09:21 | #3 |
Регистрация: 05.11.2011
Сообщений: 7
|
не выходит
Спасибо за ответ! Но что-то не выходит.
Данный код не выводит вообще ничего. select username, url, sum(bytesin+bytesout) as mb from trafnew where month = '2012-01' group by username,url having sum(bytesin+bytesout)<(max(bytesin+ bytesout)) order by username asc,url asc, mb desc с -10 тоже. Если честно, я не представляю, какие значения попадают в sum(bytesin+bytesout) и max(bytesin+bytesout). По-моему что-то не то. Да и сайты у разных пользователей могут очень сильно отличаться по объему, поэтому привязываться к разнице между max и текущим - не будет решением. Неужели нельзя ограничивать вывод данных для каждого из пользователей, по аналогии с top? наверняка распространенная задача |
31.01.2012, 10:08 | #4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
По скорости наверно не самый лучший вариант, стоит попробовать
Код:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 31.01.2012 в 10:17. |
04.03.2012, 07:28 | #5 |
Регистрация: 05.11.2011
Сообщений: 7
|
Оказалось не так сложно.
WITH Ranked as (SELECT Row_Number() OVER (PARTITION BY fullname order by sum(usedtime) desc) rank,[depart],[fullname],sum(bytesin+bytesout) as mb, url FROM empnew e RIGHT OUTER JOIN trafnew t on e.username=t.username where month = 'xxxx-xx' group by depart,fullname,url ) SELECT * FROM Ranked WHERE [rank] < 11 выводит табличку отдел * фио * самый большой сайт * мегабайты отдел * фио * поменьше сайт * мегабайты отдел * фио * ещё меньше сайт * мегабайты итд в нужном количестве, в данном случае top 10. И скорость адова. Всё-равно всем спасибо. Последний раз редактировалось медведко; 04.03.2012 в 08:32. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
В принципе должен запрещать полный доступ к файлу | Loppa | Помощь студентам | 0 | 15.10.2011 22:17 |
возможно ли вывести сводную таблицу на пользовательскую форму? | Alexa6ka | Microsoft Office Excel | 2 | 08.08.2011 10:03 |
Always on Top | Sergant | Win Api | 2 | 13.04.2007 01:09 |