Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 выполнение операций в подгруппах  [new]
devol
Member

Откуда:
Сообщений: 16
Добрый день!

Подскажите, пожалуйста, есть ли способ совершения каких-либо действий внутри подгрупп формируемых group by. То есть, получив сгруппированные данные, есть ли способ подействовать на их элементы не агрегированными функциями типа sum, count, min, а сделать подселект в этих подгруппах.

Основная проблема в том, что имея очень большую таблицу, нет желания пробегаться по ней целиком больше одного раза.

Или может есть способ выполнения ручной группировки, в обход group by?

Спасибо!
6 сен 09, 23:00    [7623768]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
Glory
Member

Откуда:
Сообщений: 104760
Может приведете пример вашего "а сделать подселект в этих подгруппах"
А то как-то невнятно поставлена задача
7 сен 09, 00:01    [7623899]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
devol
Member

Откуда:
Сообщений: 16
Сорри, пример следующий
group id value
1 1 10
2 5 12
1 2 9
1 3 8
2 6 10
3 7 11
1 4 11
3 8 12
3 9 13

есть желание сгруппировав по group, найти в каждой подгруппе минимум по айди, и для него вытащить соответствующее значение из вэлью, т.е. чтобы на выходе было
group id value
1 1 10
2 5 12
3 7 11

в случае айди, все просто select group, min(id) from T group by group
но как вытащить соответствующее значение из value - не могу понять
желательно, конечно не делать что-то вроде
select group, min(id), (select value from T b where b.id = min(id)) from T a group by group
где и хочется, сделав подзапрос к подгруппе (select value from Tsubgroup) instead of (select value from T) найти соответствующее значение.

таблица очень большая, поэтому ищу пути сокращения времени работы процедуры
7 сен 09, 09:31    [7624583]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
1
WITH CTE AS(SELECT ROW_NUMBER()OVER(PARTITION BY [group] ORDER BY [id]) N,* FROM T)
SELECT *
FROM CTE
WHERE N=1;
2
SELECT TOP 1 WITH TIES *
FROM T
ORDER BY ROW_NUMBER()OVER(PARTITION BY [group] ORDER BY [id]);
7 сен 09, 09:35    [7624597]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
devol
Member

Откуда:
Сообщений: 16
В этом случае, я так понимаю вся многогигабайтная база будет сначала скопирована в новую табличку с добавлением сортировки по группам, и только потом будет произведен сам запрос. А нет ли возможности как-то раздробить запрос на запросы в подгруппах, чтобы всместо обращения к большой таблице обращаться к маленьким таблицам-подгруппам?
7 сен 09, 09:47    [7624651]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
devol
В этом случае, я так понимаю вся многогигабайтная база будет сначала скопирована в новую табличку с добавлением сортировки по группам, и только потом будет произведен сам запрос.
Ссылку на документацию дайте, пожалуйста.
С индексами у Вас как?
7 сен 09, 10:02    [7624731]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
devol
таблица очень большая, поэтому ищу пути сокращения времени работы процедуры
Насколько большая ?
Сколько различных значений поля group ?
(интересует порядок того и другого)
7 сен 09, 10:09    [7624769]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
devol
Member

Откуда:
Сообщений: 16
Я не утверждаю, что все оно так - это лишь мне кажется, что запрос будет очень весомым. Ведь сначала даные копируются в CTE из "большой" таблицы, делая ее тем самым схожих размеров, а затем делается запрос по CTE.
А если нужно сделать больше чем одну такую операцию, например, сравнивая полученное value с неким граничным значением, скажем avg(value) по группе, которое в случае превышения его должно быть взято как, условно говоря, (row_number + 1, т.е. не N=1, а N=2 для примера ниже) - тут запрос опять будет пробегаться по всей громадной таблице. А если как-то ограничиться рамками одной группы, то запросы была бы как мне кажется гораздо легче обрабатывать в этом случае.

Индексы есть на все используемые для поиска колонки.
7 сен 09, 10:16    [7624817]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
devol
Member

Откуда:
Сообщений: 16
Паганель,

размеры следующие: групп примерно 165000, весит примерно 10gb
7 сен 09, 10:18    [7624827]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
Glory
Member

Откуда:
Сообщений: 104760
devol
Я не утверждаю, что все оно так - это лишь мне кажется, что запрос будет очень весомым. Ведь сначала даные копируются в CTE из "большой" таблицы, делая ее тем самым схожих размеров, а затем делается запрос по CTE.

Это вы в плане выполнения своего запроса увидели ?
7 сен 09, 10:18    [7624830]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
devol
весит примерно 10gb
Записей сколько?
7 сен 09, 10:19    [7624832]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
devol
Member

Откуда:
Сообщений: 16
Паганель, Размер около 65465750 записей.
Glory, я пока не запускал запрос, т.к. у меня пока нет в нем уверенности, хочется сначала оптимизировать как-то, а потом уже запускать в продакшин
7 сен 09, 10:23    [7624857]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
devol
найти в каждой подгруппе минимум по айди, и для него вытащить соответствующее значение из вэлью
devol
групп примерно 165000
То есть в отчете будут сотни тысяч строк, или где-то 10 000 страниц
(или около 20 пачек бумаги)
Неужели все это распечатывать?
7 сен 09, 10:23    [7624864]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
Glory
Member

Откуда:
Сообщений: 104760
devol

Glory, я пока не запускал запрос, т.к. у меня пока нет в нем уверенности, хочется сначала оптимизировать как-то, а потом уже запускать в продакшин

Для получения предварительного плана запроса как раз запускать и не недо
7 сен 09, 10:24    [7624867]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
devol
весит примерно 10gb
devol
около 65465750 записей.
Это около 150 байт на запись
Многовато для трех целых чисел
7 сен 09, 10:26    [7624882]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
devol
Member

Откуда:
Сообщений: 16
Паганель,

это в конечном счете не то чтобы отчет - а некое сжатие данных на основе некоторых формул, применимых к подгруппам, поэтому бумагу не жалко - отчеты будут строиться уже на "сжатых" данных - там пара страниц получится
7 сен 09, 10:26    [7624883]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
devol
Member

Откуда:
Сообщений: 16
Glory,

подскажите, пожалуйста, это мне нужно сейчас просто выполнить этот массивный запрос, чтобы увидеть сколько времени он займет? страшно)
а если много времени? (мне почему-то кажется, что много) - не лучше ли сразу как-то оптимизировать?
7 сен 09, 10:28    [7624903]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
devol
Member

Откуда:
Сообщений: 16
Паганель,

Касатально трех целых чисел - это просто неких абстрактный пример, более менее сводящий реальную ситуацию к удобной для симулирования идей, в действильности порядки там другие, да группировка ведется по более "сложным" объектам
7 сен 09, 10:30    [7624910]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
devol
это в конечном счете не то чтобы отчет -
а некое сжатие данных на основе некоторых формул, применимых к подгруппам,
поэтому бумагу не жалко - отчеты будут строиться уже на "сжатых" данных -
там пара страниц получится
Рекомендации по оформлению сообщений в форуме
Подумайте также над тем, чтобы описать решаемую Вами задачу целиком.
Возможно, что тот способ решения, который Вы стремитесь воплотить в жизнь,
не является наилучшим, а лишь кажется Вам таковым.
7 сен 09, 10:30    [7624911]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
Glory
Member

Откуда:
Сообщений: 104760
devol
Glory,

подскажите, пожалуйста, это мне нужно сейчас просто выполнить этот массивный запрос, чтобы увидеть сколько времени он займет? страшно)
а если много времени? (мне почему-то кажется, что много) - не лучше ли сразу как-то оптимизировать?

Хм. Разумеется, чтобы узнать, сколько времени займет запрос, придется его выполнить.
А для того, чтобы узнать, что будет происходить при выполнении, не обязательно запускать запрос. Можно получить предварительный план, проанализировать его и установить его оптимальность/неоптимальноссть
7 сен 09, 10:33    [7624920]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
devol
Member

Откуда:
Сообщений: 16
Паганель,

Согласен! Если говорить о реальных данных - то это потиковые данные цен на фьючерсы, которые хочется урезать до минуток. Каждую минуту около 500 значений, которые стремлюсь сжать до одного значения, которое получалось бы следующим образом: если последняя цена тика в данной минуте не превышает одно стандартное отклонение полученное для всего окна и еще некоторые правила, то брать эту цену, иначе смотреть тот же алгоритм для предыдущего значения.

Собственно тут группировака идет по времени, т.г. по минутам.
7 сен 09, 10:37    [7624938]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
devol
Каждую минуту около 500 значений
Это 720 тыс значений в сутки
То есть более 260 млн значений в год
Вы же говорите:
devol
Размер около 65465750 записей.
У Вас БД только недавно начала работать и будет продолжать расти?
Предел этому есть?
7 сен 09, 10:44    [7624982]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
devol
Member

Откуда:
Сообщений: 16
Паганель,

Я просто не хочу в тонкости вдаваться. Размер будет бесконечно расти, при том с ускорением.
7 сен 09, 10:48    [7625019]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
devol
Я не утверждаю, что все оно так - это лишь мне кажется, что запрос будет очень весомым. Ведь сначала даные копируются в CTE из "большой" таблицы, делая ее тем самым схожих размеров, а затем делается запрос по CTE.
А если нужно сделать больше чем одну такую операцию, например, сравнивая полученное value с неким граничным значением, скажем avg(value) по группе, которое в случае превышения его должно быть взято как, условно говоря, (row_number + 1, т.е. не N=1, а N=2 для примера ниже) - тут запрос опять будет пробегаться по всей громадной таблице. А если как-то ограничиться рамками одной группы, то запросы была бы как мне кажется гораздо легче обрабатывать в этом случае.

Индексы есть на все используемые для поиска колонки.

ну так определяйте на этапе вставки нужные данные и создайте доп столбцы, по которым будете отбирать..
7 сен 09, 10:50    [7625042]     Ответить | Цитировать Сообщить модератору
 Re: выполнение операций в подгруппах  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Допустим, в Вашу таблицу поступила запись, датированная 09:51 утра сегодняшних суток
Означает ли это, что в нее уже не поступит ни одна запись, датированная 09:50 утра сегодняшних суток
?

ЗЫ а дисков бесконечного размера не бывает
7 сен 09, 10:52    [7625063]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить