Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 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
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... А если пойти от простого?
Код:
select
 Url, sum(bytesin+bytesout) as mb
from таблица
group by 1
having sum(bytesin+bytesout)<(max(bytesin+bytesout)-10)
order by 1 asc, 2 desc
Где 10 - расстояние от "толщины" сайта.
Не проверял но имеется ввиду идея группировки с отсеиванием элемента группы, если его "толщина" менее Максимума-Коэффициент
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 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
По умолчанию

По скорости наверно не самый лучший вариант, стоит попробовать
Код:
DECLARE @userid int
CREATE TABLE #MyTempTable (Userid int not NULL, Url varchar(255) not NULL, Bytes bigint not NULL);
DECLARE Cursor1 CURSOR FOR
  SELECT userid FROM Tablica1 GROUP BY userid
OPEN Cursor1
FETCH Cursor1 INTO @userid
WHILE @@FETCH_STATUS=0 BEGIN
  INSERT INTO #MyTempTable
    SELECT TOP (3) @userid,Url,sum(bytesin+bytesout) FROM Tablica1 WHERE userid=@userid GROUP BY Url ORDER BY 3 DESC
  FETCH Cursor1 INTO @userid
END
CLOSE Cursor1
DEALLOCATE Cursor1
SELECT * FROM #MyTempTable
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 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.
медведко вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В принципе должен запрещать полный доступ к файлу 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