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

Откуда:
Сообщений: 150
Всем привет,

есть большая таблица с суммами по дням и очень хочется её сократить в размере.
Для этого хочу оставить только одну запись в месяц на клиента, а обороты запихать в отдельный столбец XML и хранить там.
drop table if exists #TableA;
CREATE TABLE #TableA (value_day date, customer_id varchar(64), turn decimal(18,4));

INSERT #TableA (value_day, customer_id, turn) VALUES
(DATEFROMPARTS(2018,06,01) ,'customer1',500),
(DATEFROMPARTS(2018,06,02) ,'customer1',0),
(DATEFROMPARTS(2018,06,03) ,'customer1',11),
(DATEFROMPARTS(2018,06,04) ,'customer1',22),
(DATEFROMPARTS(2018,06,05) ,'customer1',33),
(DATEFROMPARTS(2018,06,06) ,'customer1',4),
(DATEFROMPARTS(2018,06,07) ,'customer1',0),
(DATEFROMPARTS(2018,06,08) ,'customer1',0),
(DATEFROMPARTS(2018,06,09) ,'customer1',0),
(DATEFROMPARTS(2018,06,10) ,'customer1',5),

(DATEFROMPARTS(2018,06,01) ,'customer2',6),
(DATEFROMPARTS(2018,06,02) ,'customer2',50),
(DATEFROMPARTS(2018,06,03) ,'customer2',448.55),
(DATEFROMPARTS(2018,06,04) ,'customer2',854.11),
(DATEFROMPARTS(2018,06,05) ,'customer2',59855),
(DATEFROMPARTS(2018,06,06) ,'customer2',45.22),
(DATEFROMPARTS(2018,06,07) ,'customer2',10),
(DATEFROMPARTS(2018,06,08) ,'customer2',0),
(DATEFROMPARTS(2018,06,09) ,'customer2',8),
(DATEFROMPARTS(2018,06,10) ,'customer2',99);
	
select *
from #TableA


В результате должна получится сгруппированная таблица со столбцами:
- дата (конец отчетного месяца). Тип данных - дата.
- клиент (customer1 / customer2). Тип данных - строка.
- обороты по дням. Тип данных - XML.
Например для customer1:
<days>
  <d val="01.06.2018">500</d>
  <d val="02.06.2018">0</d>
  <d val="03.06.2018">11</d>
  ...
  <d val="10.06.2018">5</d>
</days>


Как бы это вывернуть?
22 авг 18, 15:19    [21650875]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
User2155,

автор
очень хочется её сократить в размере.

а в чём вы размер меряете?
22 авг 18, 15:40    [21650899]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
User2155
Member

Откуда:
Сообщений: 150
Там записи по дням на каждый день года.
Я хочу оставить только одну строку на один месяц, а суммы спрятать в XML.
22 авг 18, 16:18    [21650978]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
User2155
Там записи по дням на каждый день года.
Я хочу оставить только одну строку на один месяц, а суммы спрятать в XML.

и в чём профит? Ничего положительного вы не делаете данным желанием
22 авг 18, 16:20    [21650981]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
TaPaK
User2155
Там записи по дням на каждый день года.
Я хочу оставить только одну строку на один месяц, а суммы спрятать в XML.

и в чём профит? Ничего положительного вы не делаете данным желанием
Профит в исключении неприятно большого (для неспециалиста) количества строк.
Неспециалисты думают, что чем меньше строк, тем быстрее и проще. А тем более таблиц, таблицы - это вообще зло, лучше всего одна.
22 авг 18, 16:23    [21650986]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
alexeyvg,

автор
Профит в исключении неприятно большого (для неспециалиста) количества строк.

посмотрел в похожей табличке почти 1 млдр... хай будэ :)
22 авг 18, 16:35    [21651008]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
User2155
Member

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

у меня гораздо больше. Я готов пожертвовать временем (пусть вычисления дольше идут) лишь бы это схлопнуть.
22 авг 18, 16:48    [21651026]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
User2155
TaPaK,

у меня гораздо больше. Я готов пожертвовать временем (пусть вычисления дольше идут) лишь бы это схлопнуть.

так профит в чём от ваших хлопков?
22 авг 18, 16:51    [21651033]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
User2155
Member

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

Таблица меньшего размера.
22 авг 18, 16:54    [21651034]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
User2155
TaPaK,

Таблица меньшего размера.
нет
22 авг 18, 16:57    [21651042]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
User2155
TaPaK,

Таблица меньшего размера.
Заведите справочник кастомеров, после чего экономии от "хлопанья" не станет.
22 авг 18, 16:59    [21651045]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Гавриленко Сергей Алексеевич
User2155
TaPaK,

Таблица меньшего размера.
Заведите справочник кастомеров, после чего экономии от "хлопанья" не станет.

и прекратить хранить нулевые обороты :)
22 авг 18, 17:05    [21651052]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
User2155
Member

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

думаю да, убрать записи где нулевые обороты будет правильно.
XML в данном случае какой-то кривой вариант.
22 авг 18, 17:14    [21651060]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
invm
Member

Откуда: Москва
Сообщений: 9114
User2155
Таблица меньшего размера.
select
 a.value_day, a.customer_id, a.turn, b.x as days_data
into
 #TableB
from
 (select min(value_day), customer_id, sum(turn) from #TableA group by customer_id) a(value_day, customer_id, turn) cross apply
 (select value_day as [@val], turn as [*] from #TableA where customer_id = a.customer_id for xml path('d'), root('days'), type) b(x);

select * from #TableA;
select * from #TableB;

select sum(datalength(value_day) + datalength(customer_id) + datalength(turn)) from #TableA;
select sum(datalength(value_day) + datalength(customer_id) + datalength(turn) + datalength(days_data)) from #TableB;
22 авг 18, 17:16    [21651062]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
User2155
Member

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

жесть. Т.е. новая таблица в три раза больше :-)
22 авг 18, 17:19    [21651068]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
User2155
invm,

жесть. Т.е. новая таблица в три раза больше :-)

Ох... кто вам вообще даверил такие изыскания
22 авг 18, 17:20    [21651069]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
User2155
Member

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

спокойствие, только спокойствие. Я ж не создал эту колонку, а только думал что получится. ))
22 авг 18, 17:24    [21651072]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5156
User2155
Всем привет,

есть большая таблица с суммами по дням и очень хочется её сократить в размере.

...

Как бы это вывернуть?


ну, если в размере, то проверьте это:
sp_estimate_data_compression_savings
22 авг 18, 17:32    [21651088]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
User2155
TaPaK,

думаю да, убрать записи где нулевые обороты будет правильно.
XML в данном случае какой-то кривой вариант.
А что, у вас customer_id действительно имеет тип varchar(64), и там названия, или это просто для примера?
Для большой таблицы так делать недопустимо.

А убирать нулевые обороты хоть и очевидно полезное решение для сокращения таблицы, но запросы могут усложниться и замедлиться, придётся же искать ближайшее значение, а не просто джойнить по дате и кастомеру.
Так что нужно это тщательно взвесить.
22 авг 18, 19:10    [21651191]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1091
дык у xml как бы и оверхед немаленький, в xml возможно имеет смысл убирать только в случае если вам приходят в систему данные в xml и оперативный доступ к данным вам попросту не нужен, надо просто сохранить значения в бд на какой-то крайний случай.
у меня такое было, приходила информация в xml и я ее как есть сохранял в БД потому что в нее мне надо было добавить некоторое количество данных и отправить обратно. И чтобы не формировать этот xml по новой я просто брал что пришло ранее и добивал туда нужное после чего отправлял обратно.
22 авг 18, 20:03    [21651211]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
К чему такие сложности?
DATEFROMPARTS(2018,06,01)

достаточно половины дозы
'20180601'
23 авг 18, 09:53    [21651617]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2298
энди,

на тему оверхеда. поле nvarchar(max) в нем xml. использую встроенные функции COMPRESS/DECOMPRESS.

records_countuncomressed_sizecompressed_sizecompression_prcnt
9997920835Mb1555Mb7.46%

про размеры не пинаем, это только один день из всего содержимого
23 авг 18, 13:37    [21652026]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
ShIgor
энди,

на тему оверхеда. поле nvarchar(max) в нем xml. использую встроенные функции COMPRESS/DECOMPRESS.

records_countuncomressed_sizecompressed_sizecompression_prcnt
9997920835Mb1555Mb7.46%

про размеры не пинаем, это только один день из всего содержимого
А если распечатать на бумаге, а записи удалить, то вообще экономия будет места на диске будет потрясающая!
23 авг 18, 13:43    [21652030]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
invm
Member

Откуда: Москва
Сообщений: 9114
ShIgor
поле nvarchar(max) в нем xml. использую встроенные функции COMPRESS/DECOMPRESS
Видимо, настоящие джедаи никогда не пользуются типом данных xml.
23 авг 18, 14:01    [21652054]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать данные и создать xml колонку  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2298
invm,

а что-то отличается от способа его хранения? я что-то пропустил?
23 авг 18, 15:32    [21652173]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить