![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Регистрация: 05.11.2011
Сообщений: 7
|
![]()
Здравствуйте!
Скажите, пожалуйста, данную задачу как-то можно реализовать посредством 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-запрос. Работает не очень быстро. |
![]() |
![]() |
![]() |
#2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
Хм... А если пойти от простого?
Код:
Не проверял но имеется ввиду идея группировки с отсеиванием элемента группы, если его "толщина" менее Максимума-Коэффициент
I'm learning to live...
|
![]() |
![]() |
![]() |
#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? наверняка распространенная задача ![]() |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
По скорости наверно не самый лучший вариант, стоит попробовать
Код:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 31.01.2012 в 10:17. |
![]() |
![]() |
![]() |
#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 |