Русский
Русский
English
Статистика
Реклама

Pivot

PIVOT3- УМНЕ ИНФРАСТРУКТУРНЕ РЕШЕНИЯ

24.12.2020 18:19:54 | Автор: admin

Всем привет! Данная статья 2 по счету в блоге от команды ОЛЛИ ИТ на Хабре. Я искренне рада данной возможности, и надеюсь, что материалы нашего блога будут для вас полезны.

Для тех, кто никогда об этом не слышал

Задача любой ИТ-инфраструктуры сводится к обеспечению надежной платформы для бизнес-процессов компании. Традиционно считается, что качество информационно-технологической инфраструктуры оценивается по трем основным параметрам: доступность, безопасность, надёжность.

Самым очевидным шагом в будущее сталообъединение разрозненныхточек хранения данных и их обработки. Иными словами, почему бы не реализовать распределенную СХД не на отдельных серверах, а прямо на хостахвиртуализации, отказавшись тем самым отсети хранения и выделенного железа, и совместив таким образом функции.Речь идет огиперконвергенции.

Гиперконвергенцияберет свое начало в концепции конвергентной инфраструктуры.

Технологии в конвергентной инфраструктуре могут быть разделены и использоваться независимо друг от друга. Но при этом, эти же самые технологии вгиперконвергентнойинфраструктуре настолько тесно интегрированы, что не могут быть разбиты на отдельные компоненты.

На сегодняшний день наиболее распространенными системамигиперконвергенцииявляютсяNutanix,CiscoHyperflex,Vmware vSAN,Dell VxRAIL (комплекс сервера + ПО Vmware vSAN),HuaweiFusionCube,StarWindVirtual SAN и другое.Все они среди прочего доступны в России.

Но мало кто знает оPivot3!

Компания Pivot3 была основана несколькими ветеранами IT индустрии из компаний Compaq, VMware и Adaptec, движимыми идеей упрощения ЦОДов благодаря объединению ресурсов хранения, обработки и передачи данных в едином, мощном, легко встраиваемом решении, которое бы сокращало расходы, операционные риски, и упрощало управление в целом.Pivot3создаетгиперконвергентныерешения для критически важных инфраструктур в безопасных и интеллектуальных средах, таких как: университетские городки, города, аэропорты,call-центры, компании с большим штатом разработчиков,транспортные и федеральные объектыи т.д.

РешенияPivot3, разработанные специально для рабочих нагрузок на основе видео, таких как:видеонаблюдение, аналитика, визуализация и VDI, снижают совокупную стоимость владения, снижают риски иответственность, упрощаютуправление за счет автоматизации.Pivot3-этоединственная инфраструктураHCI,созданнаядля быстрой и удобной работы с большими объемами видеоданных.Ключевая и важная инновация-управление производительностью на основе политик, всестороннее использованиеNVMeи эффективное хранение.

ГиперконвергентныерешенияPivot3

Архитектура и функциигиперконвергентнойинфраструктурыPivot3обеспечивают значительные преимущества для инфраструктуры виртуальных рабочих столов (VDI). HCIPivot3оптимизирует развертывание виртуальных рабочих столов за счет минимизации объема инфраструктуры и совокупной стоимости владения, обеспечения оптимального взаимодействия с пользователем и упрощения перехода от пилотного к полномасштабному развертыванию.

Угиперконвергентнойинфраструктуры есть множество преимуществ. В первую очередь это инновационная технология, которая в ближайшие годы станетмейнстримоми сильно подвинет классические подходы к построению ЦОД. HCI помогает причесать разрозненную ИТ-среду, избавиться от необходимости управления несколькими системами, что несёт как организационный порядок, так и финансовую эффективность. Кроме того, сокращаются капитальные и операционные расходы. При классической инфраструктуре необходим штат специалистов, каждый из которых является экспертом в своей области,тогда как управлением HCI и всеми ее компонентами может заниматься одна группа администраторов.

Ниже представленыпримерыпреимуществгиперконвергентнойинфраструктуры* (HCI).

Гиперконвергентнаяинфраструктура (HCI)*

  • Комбинация вычислительных ресурсов и ресурсов хранения;

  • Стандартная платформаx86;

  • Модульность;

  • На базегипервизораотVMware;

  • Большая гибкость;

  • Лучшая эффективность использования;

  • Подходит для VDI инфраструктуры;

  • Высокие показатели компрессии идедупликацииданных.

Почемустоит обратить внимание наPivot3?

  • Длязадачи, где обычно требуется 4узла,Pivot3необходимо всего3;

  • Производительность базы данныхзначительно увеличилась(БД Микс пакеты 8k, комбинация запись/чтение, 100% случайное, глубина очереди 128, средние IOPS и задержка);

  • Отклик приложений;

  • Большее количество транзакций(больше 10);

  • Большая плотность данных на один узел;

  • Pivot3можетобеспечитьболеевыгоднуюэкономическуюценность, по сравнению сдругимипроизводителями, например-Nutanix.

    Pivot3: Направленность на производительность

    Прорыв в производительности дляHCI:

    HCIAcceleratorNodes

  • NVMePCIeflashинтегрирован в многоуровневую архитектуру хранения;

  • Постоянный уровень хранения,R&Wкэш;

  • Управление расширенным QoS для повышения эффективности иприоритезации.

Многоуровневое хранение

Объемы хранимых данных ежегодно увеличиваются на 5080%, что заставляет разработчиков искать альтернативы сложным СХД с ограниченноймасштабируемостью, создавать решения, более эффективно использующие ресурсы ЦОД и сокращающие время простоя, а кроме того, упрощать администрирование за счет автоматизации операций, ведь расходы на управление также быстро растут. Эта задача повышения эффективности хранения данных решается с помощью консолидации и многоуровневого хранения. Многоуровневое, иерархическое хранение информации - один из подходов, которые приходят на смену экстенсивному наращиванию емкости хранения данных.

Сравним показатели!

В качестве примерасравним общие данные эффективности оборудования на примереPivot3.

1) Многоуровневое хранение

Одноуровневая архитектуруHCI

  • Устаревшая архитектура SAS/SATA является ограничивающим фактором для производительности;

  • Сложности с консолидацией разных типов задач.

    А теперь сравним ее смногоуровневойархитектуройPivot3:

  • NVMeобеспечивает оперативный отклик;

  • QoSавтоматически подбирает оптимальный уровень размещения данных для соответствияSLA;

  • Результат эффективная консолидация разных типов задач.

Помимо многоуровневой архитектуры,Pivot3обладаетболее эффективнойутилизациейресурсов:

Часть ресурсов берётся уVMs:

  • Более высокие накладные расходыHCIOS;

  • Доступ к хранилищу черезгипервизор.

Более эффективно, большеVMs:

  • Меньше накладных расходовHCI OS;

  • Обходгипервизораозначает повышенную производительность хранилища.

Распределённая производительность

Традиционная архитектураHCI

  • Объём хранения,IOPSи ширина канала ограничены;

  • ВозможностиVMограничены производительностью конкретного узла.

Распределённая архитектураPivot3

  • Объём хранения,IOPSи ширина канала агрегируются;

  • VMдоступны все имеющиеся ресурсы.

    Pivot3 + Citrix

    Помимо всего перечисленного важно отметить, чтоCitrixиPivot3 объявили об укреплении сотрудничества для поддержки Citrix Virtual Desktops на платформе интеллектуальнойгиперконвергентнойинфраструктуры (HCI)Pivot3, что довольно актуально на сегодняшний день в связи с переходом сотрудников на удаленную работу.

Сеть технологических партнёров, с которыми сотрудничаетPIVOT3

Решения для ЦОДов Решения для ЦОДов Решения для видеонаблюдения Решения для видеонаблюдения

Продуктовые линейкиотPivot3

Вычислительные HCI решения в ЦОДВычислительные HCI решения в ЦОД
  • Оптимизация для работы вЦОДах;

  • Консолидация множественных задач с разнообразными требованиями к ресурсам;

  • Архитектура для полнофункционального использованияNVMe;

  • Автоматизированное управление на основе политик;

  • Широкий функционал по управлению данными корпоративного класса.

HCI решения для видеонаблюденияHCI решения для видеонаблюдения
  • Оптимизация для видеонаблюдения;

  • Архитектура для сохранения целостности видеоконтента и предотвращения простоев системы и потерь данных;

  • Масштабирование вычислительной мощности, ресурсов хранения или канала линейно и/или независимо;

  • Доставка видеоконтента на любые устройства;

  • Сертификация у основных производителей ПО для управлениявидеоконтентом.

    ***

    В заключениеможно сказать, что современные решения HCI от компанииPivot3сочетают в себе высокопроизводительныефлеш-каналыпередачи данных NVMe PCIe, механизмы обеспечения качества обслуживания на основе политик (QoS), распределенные ресурсы производительности и мобильность гибридных облачных систем для достижения максимальных рабочих показателей, гибкости имасштабируемости.

Подробнее..

Сводные таблицы в SQL

28.06.2020 10:17:00 | Автор: admin
Сводная таблица один из самых базовых видов аналитики. Многие считают, что создать её средствами SQL невозможно. Конечно же, это не так.


Предположим, у нас есть таблица с данными закупок нескольких видов товаров (Product 1, 2, 3, 4) у разных поставщиков (A, B, C):



Типичная задача определить размер закупок по поставщикам и товарам, т.е. построить сводную таблицу. Пользователи MS Excel привыкли получать такую аналитику буквально парой кликов:



В SQL это не так быстро, но большинство решений тривиальны.

Тестовые данные
-- таблица с полями: поставщик (supplier), товар (product), объем поставки (volume)create table test_supply (supplier varchar null, -- varchar2(10) в Oracle, и т.п.                          product varchar null,  -- varchar2(10) в Oracle, и т.п.                          volume int null                          ); -- тестовые данныеinsert into test_supply (supplier, product, volume) values ('A', 'Product 1', 928);insert into test_supply (supplier, product, volume) values ('A', 'Product 1', 422);insert into test_supply (supplier, product, volume) values ('A', 'Product 4', 164);insert into test_supply (supplier, product, volume) values ('A', 'Product 1', 403);insert into test_supply (supplier, product, volume) values ('A', 'Product 3', 26);insert into test_supply (supplier, product, volume) values ('B', 'Product 4', 594);insert into test_supply (supplier, product, volume) values ('B', 'Product 4', 989);insert into test_supply (supplier, product, volume) values ('B', 'Product 3', 844);insert into test_supply (supplier, product, volume) values ('B', 'Product 4', 870);insert into test_supply (supplier, product, volume) values ('B', 'Product 2', 644);insert into test_supply (supplier, product, volume) values ('C', 'Product 2', 733);insert into test_supply (supplier, product, volume) values ('C', 'Product 2', 502);insert into test_supply (supplier, product, volume) values ('C', 'Product 1', 97);insert into test_supply (supplier, product, volume) values ('C', 'Product 3', 620);insert into test_supply (supplier, product, volume) values ('C', 'Product 2', 776);-- проверкаselect * from test_supply;



1. Оператор CASE и аналоги



Самый простой и очевидный способ получения сводной таблицы это хардкод с использованием оператора CASE. Например, для поставщика А можно вычислить размер поставок как sum(case when t.supplier = 'A' then t.volume end). Чтобы получить объем поставок для разных товаров достаточно просто добавить группировку по полю product:

select t.product,        sum(case when t.supplier = 'A' then t.volume end) as Afrom test_supply tgroup by t.productorder by t.product;



Если добавить else 0, то для товаров, по которым не было поставок, вместо null будут выведены нули:

select coalesce(t.product, 'total_sum') as product,       sum(case when t.supplier = 'A' then t.volume end) as Afrom test_supply tgroup by t.product;



Если продублировать код для всех поставщиков (которых у нас три A, B, C), мы получим необходимую нам сводную таблицу:

select t.product,        sum(case when t.supplier = 'A' then t.volume end) as A,       sum(case when t.supplier = 'B' then t.volume end) as B,       sum(case when t.supplier = 'C' then t.volume end) as Cfrom test_supply tgroup by t.productorder by t.product;



В неё можно добавить итог по строкам (как обычную сумму, т.е. sum(t.volume)):
select t.product,       sum(case when t.supplier = 'A' then t.volume end) as A,       sum(case when t.supplier = 'B' then t.volume end) as B,       sum(case when t.supplier = 'C' then t.volume end) as C,       sum(t.volume) as total_sumfrom test_supply tgroup by t.product;



Не составит труда добавить и итог по столбцам. Для этого необходим использовать оператор ROLLUP, который позволит добавить суммирующую строку. В большинстве СУБД используется синтаксис rollup(t.product), хотя иногда доступен и альтернативный t.product with rollup (например, SQL Server).

select t.product,       sum(case when t.supplier = 'A' then t.volume end) as A,       sum(case when t.supplier = 'B' then t.volume end) as B,       sum(case when t.supplier = 'C' then t.volume end) as C,       sum(t.volume) as total_sumfrom test_supply tgroup by rollup(t.product);



Результат можно сделать ещё красивее, заменив NULL на собственную подпись итога. Для этого можно использовать функцию coalesce(): coalesce(t.product, 'total_sum'), или же любой специфичный для конкретной СУБД аналог (например, nvl() в Oracle). Результат будет следующим:

select coalesce(t.product, 'total_sum') as product,       sum(case when t.supplier = 'A' then t.volume end) as A,       sum(case when t.supplier = 'B' then t.volume end) as B,       sum(case when t.supplier = 'C' then t.volume end) as C,       sum(t.volume) as total_sumfrom test_supply tgroup by rollup(t.product);



Если СУБД не поддерживает ROLLUP ...
Если ваша СУБД настолько стара, что не поддерживает rollup, придётся использовать костыли. Например, так:

select t.product,       sum(case when t.supplier = 'A' then t.volume end) as A,       sum(case when t.supplier = 'B' then t.volume end) as B,       sum(case when t.supplier = 'C' then t.volume end) as C,       sum(t.volume) as total_sumfrom test_supply tgroup by t.productunion allselect 'total_sum',       sum(case when t.supplier = 'A' then t.volume end),       sum(case when t.supplier = 'B' then t.volume end),       sum(case when t.supplier = 'C' then t.volume end),       sum(t.volume) as total_sumfrom test_supply t;




Можно (но вряд ли стоит) использовать какую-либо из вендоро-специфичных функций вместо стандартного CASE. Например, в PostgreSQL и SQLite доступен оператор FILTER:

select coalesce(t.product, 'total_sum') as product,       sum(t.volume) filter (where t.supplier = 'A') as A,       sum(t.volume) filter (where t.supplier = 'B') as B,       sum(t.volume) filter (where t.supplier = 'C') as C,       sum(t.volume) as total_sumfrom test_supply tgroup by rollup(t.product);


Особенность FILTER в том, что он является частью стандарта (SQL:2003), но фактически поддерживается только в PostgreSQL и SQLite.

В других СУБД есть ряд эквивалентов CASE, не предусмотренных стандартом: IF в MySQL, DECODE в Oracle, IIF в SQL Server 2012+, и т.д. В большинстве случаев их использование не несёт никаких преимуществ, лишь усложняя поддержку кода в будущем.

MySQL: IF
select coalesce(t.product, 'total_sum') as product,        sum(IF(t.supplier = 'A', t.volume, null)) as A,       sum(IF(t.supplier = 'B', t.volume, null)) as B,       sum(IF(t.supplier = 'C', t.volume, null)) as C,       sum(t.volume) as total_sumfrom test_supply tgroup by rollup(t.product);



Oracle: DECODE
select coalesce(t.product, 'total_sum') as product,        sum(decode(t.supplier, 'A', t.volume, null)) as A,       sum(decode(t.supplier, 'B', t.volume, null)) as B,       sum(decode(t.supplier, 'C', t.volume, null)) as C,       sum(t.volume) as total_sumfrom test_supply tgroup by rollup(t.product);



SQL Server 2012 или выше: IIF
select coalesce(t.product, 'total_sum') as product,        sum(iif(t.supplier = 'A', t.volume, null)) as A,       sum(iif(t.supplier = 'B', t.volume, null)) as B,       sum(iif(t.supplier = 'C', t.volume, null)) as C,       sum(t.volume) as total_sumfrom test_supply tgroup by rollup(t.product);



2. Использование PIVOT (SQL Server и Oracle)



Описанный выше подход трудно назвать красивым. Как минимум, хочется не дублировать код для каждого поставщика, а просто их перечислить. Сделать это позволяет разворот (PIVOT) таблицы, доступный в в SQL Server и Oracle. Хотя этот оператор не предусмотрен стандартом SQL, обе СУБД предлагают идентичный синтаксис.

Для начала нам необходима таблица с агрегированной статистикой, которую мы развернём. Казалось бы, для этого достаточно взять суммы по товару и провайдеру:

select t.supplier,       t.product,       sum(t.volume) as aggfrom test_supply tgroup by t.product,         t.supplier;



И этого будет достаточно если нам нужны итоги только по товарам и по провайдерам. Если же мы хотим получить все возможные итоги, необходимо выбрать все возможные сочетания товара и провайдера, в том числе такие где товар или провайдер NULL:

select t.supplier, t.product, sum(t.volume) as aggfrom test_supply tgroup by t.supplier, t.productunion allselect null, t.product, sum(t.volume)from test_supply tgroup by t.productunion allselect t.supplier, null, sum(t.volume)from test_supply tgroup by t.supplierunion allselect null, null, sum(t.volume)from test_supply t;



Этот запрос можно существенно упростить, используя оператор CUBE:

select t.supplier,        t.product,        sum(t.volume) as aggfrom test_supply tgroup by cube(t.supplier, t.product);


Если мы хотим получить подпись итогов как 'total_sum' вместо NULL запрос необходимо немного откорректировать:

select coalesce(t.supplier, 'total_sum') as supplier,        coalesce(t.product, 'total_sum') as product,        sum(t.volume) as aggfrom test_supply tgroup by cube(t.supplier, t.product);



К такому результату уже можно применять PIVOT:

select *from ( select coalesce(t.supplier, 'total_sum') as supplier,       coalesce(t.product, 'total_sum') as product,       sum(t.volume) as aggfrom test_supply tgroup by cube(t.supplier, t.product)      ) tpivot (sum(agg)         -- NB: ниже в SQL Server - двойные кавычки, в Oracle DB - одинарные       for supplier in ("A", "B", "C", "total_sum")       ) pvt;


Здесь мы поворачиваем таблицу из прошлого запроса, используя агрегатную функцию суммы sum(agg). При этом заголовки столбцов мы берём из поля supplier, а с помощью in ("A", "B", "C", "total_sum") указываем какие конкретно поставщики должны быть выведены (total_sum отвечает за столбец с итогами по строкам).

3. Common table expression



В принципе, для поворота таблицы нам не нужен оператор PIVOT как таковой. Этот запрос можно легко переписать, используя стандартный синтаксис комбинацию CTE (common table expression) и соединений. Для этого будем использовать тот же запрос, что и для PIVOTа:

with cteas(select coalesce(t.supplier, 'total_sum') as supplier,          coalesce(t.product, 'total_sum') as product,          sum(t.volume) as aggfrom test_supply tgroup by cube(t.supplier, t.product))select * from cte;



Из результатов, полученных в cte нам необходимы только уникальные значения товаров:
select distinct t.product from cte t


к которым можно поочередно присоединять объем закупок для каждого отдельно взятого поставщика:

left join cte aon t.product = a.productand a.supplier = 'A'


Здесь мы используем левое соединение т.к. у поставщика может не быть поставок по некоторым продуктам.

Окончательный запрос будет выглядеть таким образом:

with cteas(select coalesce(t.supplier, 'total_sum') as supplier,          coalesce(t.product, 'total_sum') as product,          sum(t.volume) as aggfrom test_supply tgroup by cube(t.supplier, t.product))select distinct t.product,                     a.agg as A,                    b.agg as B,                    c.agg as C,                    ts.agg as total_sumfrom cte tleft join cte aon t.product = a.product and a.supplier = 'A'left join cte bon t.product = b.product and b.supplier = 'B'left join cte con t.product = c.product and c.supplier = 'C'left join cte tson t.product = ts.product and ts.supplier = 'total_sum'order by product;



Конечно, такой запрос это proof-of-concept, поэтому выглядит он довольно экзотично.

4. Функция CROSSTAB (PostgreSQL)



В PostgreSQL доступна функция CROSSTAB, которая примерно эквивалентна PIVOT в SQL Server или Oracle. Для работы с ней необходимо расширение tablefunc:
create extension tablefunc; -- для PostgreSQL 9.1+


CROSSTAB принимает в качестве основного аргумента запрос как text sql. Он будет практически тем же, что и для PIVOT, но с обязательным использованием сортировки:
select coalesce(t.product, 'total_sum') as product,         coalesce(t.supplier, 'total_sum') as supplier,                           sum(t.volume) as aggfrom test_supply tgroup by cube(t.supplier, t.product)order by product, supplier;


В отличие от PIVOT, для разворота таблицы нам необходимо указывать не только названия столбцов, но и типы данных. Например, так: "product" varchar, "A" int8, "B" int8, "C" int8, "total_sum" int8.
Ещё один нюанс состоит в том, что CROSSTAB заполняет строки слева направо, игнорируя NULL-овые значения. Например, такой запрос:

select *from crosstab     (    $$select coalesce(t.product, 'total_sum') as product,     coalesce(t.supplier, 'total_sum') as supplier,                       sum(t.volume) as agg      from test_supply t      group by cube(t.supplier, t.product)      order by product, supplier $$     )   as cst("product" varchar, "A" int8, "B" int8, "C" int8, "total_sum" int8);


вернёт совсем не то, что мы хотим:



Как можно заметить, там, где были NULL-овые значения, всё съехало влево. Например, в первой строке для Product1 итог по строке оказался в столбце для поставщика С, а поставки С в столбце поставщика В (для которого поставок не было). Корректно проставлены данные только для Product3 т.к. для этого товара у всех поставщиков были значения. Иными словами, если бы у нас не было NULL-овых значений, запрос был бы корректным и вернул нужный результат.

Чтобы не сталкиваться с таким поведением CROSSTAB нужно использовать вариант функции с двумя параметрами. Второй параметр должен содержать запрос, выводящий список всех столбцов в результате. В нашем случае это все названия поставщиков из таблицы + total_sum для итогов:

select distinct tt.supplier as supplierfrom test_supply ttunion allselect 'total_sum'order by supplier


а полный запрос будет выглядеть так:

select * from crosstab     (    $$select coalesce(t.product, 'total_sum') as product,     coalesce(t.supplier, 'total_sum') as supplier,                       sum(t.volume) as agg      from test_supply t      group by cube(t.supplier, t.product)      order by product, supplier $$,    $$select distinct tt.supplier as supplier      from test_supply tt      union all      select 'total_sum'      order by supplier $$     )   as cst("product" varchar, "A" int8, "B" int8, "C" int8, "total_sum" int8);



5. Динамический SQL (на примере SQL Server)



Запрос с PIVOT или CROSSTAB уже функциональнее, чем изначальный с CASE (или CTE), но названия поставщиков все ещё необходимо вносить вручную. Но что делать, если поставщиков много? Или если их список регулярно обновляется? Хотелось бы выбирать их автоматически как как select distinct supplier from test_supply (или же из словаря, если он есть).

Здесь чистого SQL недостаточно. Он подразумевает статическую типизацию: для создания плана запроса СУБД нужно заранее указать число столбцов. Поэтому, например, синтаксис PIVOT не позволяет использовать подзапрос. Но это ограничение легко обойти с помощью динамического SQL! Для этого названия столбцов необходимо преобразовать в строку формата "элемент_1", "элемент_2", , "элемент_n", и использовать их в запросе.

Например, в SQL Server мы можем использовать STUFF для получения такой строки

declare @colnames as nvarchar(max);select @colnames =            stuff((select distinct ', ' + '"' + t.supplier + '"'       from test_supply t       for xml path ('')       ), 1, 1, ''          ) + ', "total_sum"';


а затем включить её в окончательный запрос:

-- T-SQL (!)declare @colnames as nvarchar(max),        @query as nvarchar(max);select @colnames =            stuff((select distinct ', ' + '"' + t.supplier + '"'       from test_supply t       for xml path ('')       ), 1, 1, ''          ) + ', "total_sum"';set @query =   'select * from(select coalesce(t.supplier, ''total_sum'') as supplier, coalesce(t.product, ''total_sum'') as product, sum(t.volume) as aggfrom test_supply tgroup by cube(t.supplier, t.product)) as tpivot (sum(agg) for supplier in (' + @colnames + ')) as pvt';execute(@query);


Динамический SQL вполне можно применить и к самому первому решению с CASE. Например, так:

-- T-SQL (!)select distinct supplier into #colnames from test_supply;declare @colname as nvarchar(max),        @query as nvarchar(max);set @query = 'select coalesce(t.product, ''total_sum'') as product';while exists (select * from #colnames)begin    select top 1 @colname = supplier from #colnames;    delete from #colnames where supplier = @colname;    set @query = @query + ', sum(case when t.supplier = ''' + @colname + ''' then t.volume end) as ' + @colnameend;set @query = @query + ' , sum(t.volume) as total_sum                       from test_supply t                       group by rollup(t.product)'drop table #colnames;execute(@query);


Здесь используется цикл для итерации по доступным поставщикам в таблице test_supply (можно заменить на словарь, если он есть), после чего формируется соответствующий кусок запроса:

  sum(case when t.supplier = '<Поставщик 1>' then t.volume end) as <Поставщик 1>, sum(case when t.supplier = '<Поставщик 2>' then t.volume end) as <Поставщик 2>..., sum(case when t.supplier = '<Поставщик n>' then t.volume end) as <Поставщик n>


Во многих СУБД доступно аналогичное решение. Тем не менее, мы уже слишком отдалились от чистого SQL. Любое использование динамического SQL подразумевает углубление в специфику конкретной СУБД (и соответствующего ей процедурного расширения SQL).

Итого: как мы выяснили, сводную таблицу можно легко создать средствами SQL. Более того, это можно множеством разных методов достаточно лишь выбрать оптимальный для вашей СУБД.
Подробнее..

Все пошло не по плану как поменять курс развития продукта и не остаться в проигрыше

10.07.2020 10:09:27 | Автор: admin
Много хороших продуктов прекратили работу из-за отказа в смене вектора развития (или незнания о такой возможности). Но есть примеры, когда перемены вдыхали в бизнес вторую жизнь. В этом помогает Pivot, о котором подробно поговорим в этой статье: что это такое, как определить потребность в вираже и какие типы пивот существуют.

image

Что такое pivot


Антон, хватит крутить головой по сторонам часто говорил мне учитель в школе. И нас учили, что надо концентрироваться на одной цели и не смотреть по сторонам. Кто бы мог подумать, что для бизнеса это иногда полезно

Pivot (вираж) смена курса развития бизнеса с целью проверить другие направления деятельности и развития. Пивот используют для проверки фундаментальных гипотез о продукте, бизнес-модели или механизма роста.

image

Существует ошибочное мнение, что смена направления деятельности провал для стартапа. Мы считаем, что вираж неотъемлемая часть развития любого бизнеса. Ведь лучше вовремя понять, что делаешь неправильно и сменить вектор развития, чем в конечном итоге потерять все и не решить ни одной проблемы пользователей.

Есть сомнения? Тогда время пруфов на примере крупных компаний. В 2000-х годах Кевин Систром начал изучать программирование и создал приложение Burbn для обмена фотографиями с широким функционалом, напоминающим что-то между Foursquare и Mafia Wars.

Компания росла, но очень медленными темпами. Многие функции не пользовались успехом, так как были лучше реализованы в Foursquare. После прихода в компанию Майка Кригера предприниматели решили отбросить все ненужное и ориентироваться на простом обмене фото и видео с фильтрами и социальным распространением (то, что пользовалось среди пользователей наибольшим спросом, но медленно развивалось из-за усложняющих интерфейс других функций).

В результате в 2012 году проект, известный сегодня как Instagram, за $300 миллионов выкупил Facebook.

И таких историй очень много. Далее в статье приведем еще несколько примеров для наглядности. А пока продолжим обсуждать виражи. Подумайте, в какие моменты необходим разворот? Дальше поговорим именно об этом, можете сверить свои варианты ответов.

Как понять, что настало время для разворота?


Стартап не решает проблему пользователей


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

Это самая распространенная причина, из-за которой организациям приходится делать виражи. Мало того, через это проходили многие успешные сегодня компании. Например, Yelp в 2004 году представлял собой сервис рассылки рекомендательных запросов. Идея сомнительная и неудивительно, что она провалилась.

Зато во время первых тестов основатели обнаружили, что людям интересно писать обзоры на местный бизнес и читать такие же записи от других пользователей. Функционал платформы изменили, курс развития направили в другую сторону. Сегодня ежегодный оборот компании $500 миллионов, а ежемесячная аудитория 50 миллионов пользователей.

Стартапу не удается привлечь нужных пользователей


Такая ситуация чаще всего возникает по двум причинам: стартаперы не стали делать MVP для тестирования гипотезы или целевая аудитория оказалась не такой большой, как планировалось.

Выход из ситуации расширение функционала продукта для привлечения новых пользователей или полная смена курса развития на другую аудиторию.

Привлечение и удержание пользователей слишком дорогое


Продукт работает, решает проблему целевой аудитории, но стратегия привлечения и удержания пользователей неэффективна стоимость привлечения новых и удержания старых пользователей высокая. В таких ситуациях не меняют вектор развития стартапа (бизнеса) кардинально, а задумываются о вираже способа монетизации, механизма роста или канала сбыта (о них поговорим далее).

Клиенты не готовы платить стартапу


Бизнес стабильно функционирует, решает проблему потребителей, но они не готовы платить установленную стоимость. Случается это из-за слишком высокой цены или несоответствия функционала стоимости. В такой ситуации есть два варианта:

  1. Сократить функционал и снизить цену продукта.
  2. Расширить функционал и найти новую платежеспособную аудиторию.

Какой вариант выбрать? Решать вам, основываясь на управленческом опыте и объективных аргументах (например, проведенные тесты).

Производство продукта обходится стартапу слишком дорого


С этой проблемой чаще всего сталкиваются компании, занимающиеся производством физических товаров. Тем не менее, и ИТ-стартапы иногда с ней сталкиваются.

В такой ситуации ищут пути снижения себестоимости продукта. Причем проблема часто кроется не в самом производстве, а в сопутствующих направлениях. Например, большие расходы на содержание интернет-магазина. Иногда отказываются от сайтов и переходят исключительно на приложения. Все это pivot платформы, о котором далее поговорим более подробно.

Катерина Фейк и Стюарт Баттерфилд владельцы стартапа Ludicorp изначально разрабатывали Flickr как онлайн-игру, но затем поняли, что их технология способна решать более глобальную проблему. Они произвели пивот платформы и сконцентрировались на фотошэринге. Кстати, первоначальная игра в свет так и не вышла, а проект в 2005 году выкупил Yahoo! (сумма сделки неизвестна до сих пор).

Если вы столкнулись с одной из перечисленных проблем, проводите анализ и принимайте быстрое решение о развороте. Так вы сэкономите денежные средства и поставите бизнес на путь устойчивого развития. К тому же, у вас уже есть реальные данные о поведении пользователей, их потребностях и проблемах. Это упростит дальнейшее развитие.

Виды pivot


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

Pivot-увеличение (Zoom-in pivot)


Одна из функций текущего сервиса становится отдельным продуктом. По такому пути пошли создатели Instagram: от прежнего сервиса Burbn оставили обмен фото и видео с фильтрами и социальным распространением.

Pivot-уменьшение (Zoom-out pivot)


Текущий продукт становится частью нового многофункционального сервиса. Аналогичным образом развивался Yelp из сервиса регулярных email-рассылок рекомендательных запросов превратился в крупнейший портал с отзывами о местном бизнесе.

Pivot сегмента потребителей (Customer segment pivot)


Компания понимает, что решает проблемы не тех потребителей, на которых ориентировалась изначально (вследствии чего бизнес развивается медленно). В результате переключаются на сегмент, в котором продукт востребован.

Pivot потребности клиентов (Customer need pivot)


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

Пивот потребности клиентов на первых этапах развития совершил PayPal. Изначально сервис обслуживал электронные аукционы и не пользовался большой популярностью. Создатели поняли, что способны решить проблему другого сегмента и переключились на осуществление онлайн-переводов.

К 2002 году PayPal стал настолько популярным, что через него проводили 40% транзакций на eBay. Гигант электронной коммерции выкупил компанию за $1,5 миллиарда.

Pivot платформы (Platform pivot)


Переход от приложения к платформе и наоборот. Яркий пример прекращение поддержки Palm Pilot стартапом Cofinity в пользу разработки веб-платформы. В результате такого виража маленькой организации удалось вырасти до крупной компании, известной сегодня как PayPal.

Pivot способа монетизации (Value capture pivot)


Смена способа монетизации продукта. Например, доступ к сервису открывался за единоразовую оплату, из-за чего доходов не хватало для покрытия расходов. Впоследствии перешли на ежемесячную подписку и начали получать стабильную прибыль.

Pivot бизнес-архитектуры (Business architecture pivot)


Есть две популярные модели бизнеса:

  1. Сложные системы высокая доля прибыли и небольшие объемы продаж.
  2. Объем операций низкая доля прибыли и большие объемы продаж.

Как правило, первой соответствует модель B2B, а второй, соответственно, B2C. Яркий пример пивота Slack, который не стали развивать как привычный всем мессенджер, а предложили его как удобное средство взаимодействий для бизнеса.

Pivot механизма роста (Engine of growth pivot)


Если компания развивается медленно, меняют механизм роста: выбирают тот, который больше всего соответствует поставленным целям. Эксперты выделяют три вида:

  1. Механизм липкого роста привлечение и удержание клиентов в течение длительного периода времени.
  2. Механизм вирусного роста продвижение продукта за счет существующих пользователей (например, реферальная программа). При таком механизме значительную часть маркетинга на себя берут текущие клиенты.
  3. Механизм оплаченного роста повышение доходности каждого оплаченного клиента или снижение стоимости его приобретения.


Pivot канала сбыта (Channel pivot)


Этот вираж подразумевает смену канала, по которому компания доставляет продукт клиенту. Например, интернет-магазин упраздняет собственную площадку и переходит на Ozon.

Pivot технологии (Technology pivot)


Перенос текущего функционала на новую технологическую платформу. Пивот характерен для стабильных компаний, у которых уже есть потребители, налажен рабочий процесс, но не хватает мощностей для обслуживания всех желающих. Например, такой вираж проделал Spotify, когда перешел на Symfony2.

Теперь вы знаете, что ошибки или неправильное планирование не конец стартапа, а иногда его начало. В этом можно убедиться на примерах, описанных в статье. Главное точно определить причину, почему что-то пошло не так и выбрать правильный тип пивота. Если у вас остались какие-то вопросы, задавайте их в комментариях, мы с радостью на них ответим.

Ещё больше про Pivot вы можете узнать на нашем годовом курсе Профессия: Продакт (от 0 до PRO) Узнать подробности!

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru