powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Select Sum(STROKA) - новый подход
7 сообщений из 7, страница 1 из 1
Select Sum(STROKA) - новый подход
    #32374999
andrew_Pr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица типа
Table1 (id (int), group_id (int), stroka (varchar))
нужно получить таблицу
group_id, stroka+stroka+stroka...
Классический вариант решения этой задачи я знаю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Select group_id, col_in_list(group_id) From table1 Group by group_id,
где col_in_list есть UDF типа
Create function col_in_list (@par1 int)
Returns varchar( 8000 )
AS
Begin
 declare @Ret varchar( 8000 )
 set @Ret = ''
 Select @Ret=@ret+rtrim(stroka) From table1 Where group_id=@par1
 Return @ret
End


Но UDF на больших объемах тормозит. Хочу предложить
альтернативный вариант.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Select group_id,stroka, sumstrok=cast('' as varchar( 8000 )) 
         into #tmptbl1 From table1  order by group_id
declare @sumStrok varchar( 8000 ), @id int
select @sumStrok='', @id=- 1 
update #tmptbl1 set  
sumStrok=@sumStrok,
@sumStrok=case when @id=group_id then @sumStrok+rtrim(stroka) else rtrim(stroka) end,
@id=case when @id=group_id  then @id else group_id  end

Select t.group_id,t.sumStrok from #tmptbl1 t,
 (select group_id, maxlen=max(len(sumstrok)) from #tmptbl1 group by group_id ) g
where t.group_id=g.group_id and len(t.sumstrok)=g.maxlen
drop table #tmptbl1


ИМХО, при большом числе группировок (неуникальных значений в group_id)
данный вариант будет работать быстрее.
Быстродействие возрастает за счет того, что в данном варианте исходная
таблица Table1 сканируется не более 4 раз, тогда как в классическом
варианте 1+колич. вызовов UDF = колич. уник. знач. в group_id.
С другой стороны, конечно, создание временной таблицы, ее update тоже
займет не мало времени. Хотелось бы услышать мнение общественности
на этот счет. С уважением ко всем.
...
Рейтинг: 0 / 0
Select Sum(STROKA) - новый подход
    #32375038
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я чё-то не могу уловить тайного смысла этого:
@id=case when @id=group_id then @id else group_id end

а вобще - нет никаких гарантий что апдейтится будет всегда в нужном порядке. Насколько было б лучше если б у апдейта был order by...
...
Рейтинг: 0 / 0
Select Sum(STROKA) - новый подход
    #32376013
andrew_Pr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, вообще-то в @id=case .... я в холостую стреляю,
можно просто @id=group_id
>> нет никаких гарантий что апдейтится будет всегда в нужном порядке
Select ... into #tmptbl1 From table1 order by group_id
Почему бы после этого update должен обрабатывать в другом порядке?
( Говорят, M$ сформировал отдел разработки MSSQL2k в основном из бывших
разработчиков VFP, вот они там везде Scan... EndScan и понавставляли. :) )
...
Рейтинг: 0 / 0
Select Sum(STROKA) - новый подход
    #32376027
Фотография tpg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторSelect ... into #tmptbl1 From table1 order by group_id

А проверял?
...
Рейтинг: 0 / 0
Select Sum(STROKA) - новый подход
    #32376120
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 andrew_Pr
Select ... into #tmptbl1 From table1 order by group_id
Почему бы после этого update должен обрабатывать в другом порядке?

А почему в том же?

Говорят, M$ сформировал отдел разработки MSSQL2k в основном из бывших
разработчиков VFP, вот они там везде Scan... EndScan и понавставляли

а мне почему-то кажется что они таких залепух как @id=case when @id=group_id then @id else group_id end не пишут

и еще, забыл дописать в прошлый раз
чем мне не нравится Ваш подход: он ориентируется именно на порядок записей , а не на обработку данных

и еще чуть-чуть: если Вы пишите хотите конструктивного обсуждения, то пишите MS , если Вам хочется выразить свои эмоции - то M$
...
Рейтинг: 0 / 0
Select Sum(STROKA) - новый подход
    #32376354
andrew_Pr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> А проверял?
Проверять-то проверял, результат всегда правильный.
Другое дело, что это действительно не документированная возможность,
а значит результаты теста не дают гарантии на будущее.

А на счет программистов MS я пошутил. Если кого задел, прошу прощения.
...
Рейтинг: 0 / 0
Select Sum(STROKA) - новый подход
    #32417625
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>SergSuper
>...нет никаких гарантий что апдейтится будет всегда в нужном порядке...

На самом деле порядок UPDATE вполне можно указать, если существует
соответствующий индекс. Ключевая фраза - UPDATE t FROM table1 t WITH (INDEX())
Проверено на нарастающих итогах, пока сбоев не наблюдалось
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Select Sum(STROKA) - новый подход
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]