Как работать с оконными функциями в Google BigQuery — подробное руководство > NetPeak - Независимость и осознанность
NetPeak Biz Tech    


Как работать с оконными функциями в Google BigQuery — подробное руководство

Как работать с оконными функциями в Google BigQuery — подробное руководство

< >

Количество данных стремительно растет. Растет и интерес к сервисам для их хранения и обработки. Один из сравнительно новых и качественных инструментов в области хранения и обработки больших массивов информации — облачная база данных Google BigQuery. Инструмент способен обpaбатывать сотни тысяч строк в секунду. Если верить открытым источникам, среди множества инструментов, направленных на обработку Big Data, Google BigQuery предпочитают «М.Видео», «Юлмарт», «Связной», Ozon.Travel, «Эльдорадо», Onlinetours, Anywayanyday и «Вымпелком». 

В работе BigQuery — более простой инструмент, чем MySQL и PostgreSQL, да и большинство других. Все потому, что в инструменте отсутствует часть работы, связанная с администрированием сервера. Оптимизацией работы базы занимается непосредственно Google. Второй приятный бонус — вам не придется тратиться на дорогостоящие сервера, так как вся информация в данном случае хранится и обpaбатывается на серверах Google. Относительный минус — учебного материала по работе с BigQuery очень мало. На русском языке его пpaктически нет. Я решил исправить сей обидный факт, поэтому знакомлю вас с некоторыми возможностями этой базы данных. Для дальнейшей работы вам необходимо скачать csv файл, который мы сейчас загрузим в BigQuery.

Загрузка данных в Google BigQuery из CSV файла

Научимся загружать данные в BigQuery. Этот навык пригодится для отработки на пpaктике всех примеров запросов, описанных далее в статье. 1. Выбираем проект, в который нам необходимо загрузить таблицу. Жмем на кнопку меню напротив названия проекта и выбираем пункт «Create new dataset». 2. Задаем имя набора данных и жмем «OK». 3. Далее в созданном наборе данных жмем «+». 4. На вкладке «Choose destination» задаем имя таблицы и жмем «Next» в нижней части диалогового окна. 5. На вкладке «Select data» жмем кнопку «Choose file». 6. Выбираем скачанный ранее файл и жмем «Next». 7. На вкладке «Specify schema» описываем структуру таблицы, добавляя поля нажатием кнопки «Add fields». 8. На вкладке «Advanced options» мы должны задать разделитель полей. В нашем случае это точка с запятой. Устанавливаем переключатель «Field delimiter» в положение «Other» и в текстовом поле прописываем «;». Также можем задать другие настройки. Например, в нашем исходном файле первая строка содержит заголовки, которые нам не надо загружать в таблицу. Поэтому в текстовом поле настройки «Header rows to skip» указываем 1 и жмем «Submit». 9. После этого будет запущен процесс загрузки данных в созданную таблицу. 10. Жмем кнопку «Compose query». Теперь вы можете писать свой первый запрос, к только что загруженным данным:

select *from Test_WF.test_structure

Оконные функции в Google BigQuery

Оконные функции — самые полезные в BigQuery. По сути, их действие схоже с агрегирующими функциями. Разница заключается в том, что при использовании агрегирующих функций необходимо группировать результат по полям, к которым агрегирующие функции не применяются. А оконные функции выполняют подобные вычисления без группировки, возвращая агрегированный нужным вам способом результат для каждой строки. Таким образом, этот тип функций не меняет выборку, а лишь добавляет в нее необходимую информацию. Давайте разберемся, что в данном случае подразумевается под окном.

Окно — это некое выражение, описывающее разделение всей таблицы на отдельные наборы строк, а также описывающее сортировку строк в этих наборах.

Схематически работу оконной функции можно показать следующим образом. Возьмем функцию SUM (Salary) OVER (PARTITION BY Department), запущенную на загруженных ранее тестовых данных. Результат: Синтаксис всех оконных функций, существующих в Google BigQuery, требует обязательный пункт OVER. Этот пункт дает возможность описать три дополнительных параметра для разделения данных таблицы на окна.

  1. Partition позволяет указать признак формирования окна, то есть признак, по которому вы будете разделять данные для агрегирования.
  2. Order позволит вам задать сортировку внутри окна.
  3. Window Frame дает возможность устанавливать смещение строк внутри окна по различным признакам, например, по времени.

Синтаксис оконных функций выглядит так: Рассмотрим отдельные блоки и их предназначение.

1. PARTITION BY

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

2. ORDER BY

ORDER BY позволяет задавать сортировку внутри каждого созданного с помощью PARTITION BY окна.

3. WINDOW FRAME

С помощью этой необязательной опции вы можете задавать смещение внутри каждого окна. Например, вам нужно просуммировать текущую строку таблицы с двумя предыдущими. Синтаксис функции будет выглядеть так:

sum(Salary) over (ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)

Синтаксис опции Window Frame можно описать отдельно, он выглядит следующим образом:

{ROWS | RANGE} {BETWEEN start AND end | start | end}

 Описание Window Frame начинается с одного из ключевых слов, ROWS или RANGE.

3.1. ROWS

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

sum(Salary) over (ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)

3.2. RANGE

Дает возможность указать диапазон значений для вычислений. Например:

sum(Salary) over (order by Salary RANGE BETWEEN 1000 PRECEDING AND CURRENT ROW)

Формула просуммирует зарплаты сотрудников со всеми зарплатами, которые попадают в диапазон «на 1000 меньше», чем у сотрудника в текущей строке в рамках каждого окна. С выбранным ключевым словом ROW или RANGE, как вы уже могли заметить из примеров, необходимо задавать диапазон агрегирования по схеме: 

BETWEEN start AND end

3.3. BETWEEN START AND END

Start описывает начальное смещение в рамках окна относительно текущей строки. Start принимает следующие значения:

{UNBOUNDED PRECEDING | CURRENT ROW | expr PRECEDING | expr FOLLOWING}

 где:

  • UNBOUNDED PRECEDING — первая строка текущего окна;
  • CURRENT ROW — текущая строка;
  • expr PRECEDING — определяет количество предыдущих, участвующих в расчетах строк. Вместо expr вы должны указать количество предыдущих участвующих в расчетах строк относительно текущей строки;
  • expr FOLLOWING — определяет количество строк для агрегации из числа тех, что следуют за текущей строкой.

End описывает конечное значение диапазона смещения и принимает такие же значения, как и Start. Например:

{UNBOUNDED FOLLOWING | CURRENT ROW | expr PRECEDING | expr FOLLOWING}

 UNBOUNDED FOLLOWING в данном случае используется для того, чтобы задать в качестве последней строки агрегации последнюю строку текущего окна. Пример описания Between Start and End в функции:

sum(Salary) over (ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)

 В данном случае Start — это «2 PRECEDING» а End — «CURRENT ROW». Эта функция говорит просуммировать в рамках текущего окна поля Salary две предыдущие строки и текущую. Поскольку пункт PARTITION BY не описан, текущим окном является вся таблица.

Главное отличие оконных функций от агрегирующих в том, что они не группируют результат, а указывают агрегированное значение для каждой отдельной строки. Этот функционал очень полезен для построения аналитических отчетов, расчета скользящего среднего и нарастающих итогов.

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

SELECT name, value, SUM(value) OVER (ORDER BY value) AS RunningTotalFROM(SELECT \"a\" AS name, 0 AS value), (SELECT \"b\" AS name, 1 AS value), (SELECT \"c\" AS name, 2 AS value),(SELECT \"d\" AS name, 3 AS value),(SELECT \"e\" AS name, 4 AS value) ;

Результат: Чтобы посчитать нарастающий итог по зарплатам сотрудников на тестовых данных, загруженных нами ранее, запустим следующий запрос:

SELECTCONCAT(First_name, \" \", Last_name) as fullName,Salary,SUM(Salary) OVER (ORDER BY fullName) as runningTotalFROM Test_WF.test_structure

Результат: Поле «runningTotal» вернуло нарастающий итог по зарплатам.

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

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

SELECTDepartment,Position,round(Salary / departmentSalarySum * 100 , 2) as headSalaryPercentFROM(SELECTPosition,Department,Salary,SUM(Salary) OVER (PARTITION BY Department) as departmentSalarySumFROM Test_WF.test_structure) WHEREPosition in(\\\'Department head\\\',\\\'CTO\\\',\\\'CFO\\\',\\\'Cheif Accountant\\\')

 Результат: Если вы хотите производить какие-либо вычисления с результатами, которые возвращает оконная функция, их необходимо выносить в запрос на уровень выше, а сами вычисления производить в отдельном подзапросе.

SELECTPosition,Department,Salary,SUM(Salary) OVER (PARTITION BY Department) as departmentSalarySumFROM Test_WF.test_structure

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

SELECTDepartment,Position,round(Salary / departmentSalarySum * 100 , 2) as headSalaryPercent

Потом остается только отфильтровать результат запроса, чтобы итоговая таблица содержала данные только по руководителям отделов.

WHEREPosition in(\\\'Department head\\\',\\\'CTO\\\',\\\'CFO\\\',\\\'Cheif Accountant\\\')

 Рассмотрим все существующие на момент написания статьи оконные функции BigQuery.

1. Функции AVG(numeric_expr), COUNT(*), COUNT([DISTINCT] field), MAX(field), MIN(field), STDDEV(numeric_expr), SUM(field)

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

  • AVG — среднее арифметическое;
  • COUNT — количество значений;
  • COUNT[Distinct] — количество уникальных значений;
  • MAX — максимальное значение;
  • MIN — минимальное значение;
  • STDDEV — среднеквадратичное отклонение;
  • SUM — сумма значений.

Пример запроса:

SELECT Department, AVG(Salary) OVER (PARTITION BY Department) as winAvg, COUNT(Salary) OVER (PARTITION BY Department) as winCount, COUNT(DISTINCT Position) OVER (PARTITION BY Department) as winCountDistinct, MAX(Salary) OVER (PARTITION BY Department) as winMax, MIN(Salary) OVER (PARTITION BY Department) as winMin, STDDEV(Salary) OVER (PARTITION BY Department) as winStDev, SUM(Salary) OVER (PARTITION BY Department) as winSumFROM Test_WF.test_structure

 Результат запроса:  Этот запрос вернет все перечисленные в описании значения с разбивкой по отделам для каждой строки таблицы.

2. Функция CUME_DIST()

Возвращает кумулятивное распределение значения группе значений. Рассчитывается по формуле <количество предыдущих строк окна, включая текущую> / <общее количество строк окна>. Для данной функции описание ORDER BY в пункте OVER обязательно. Пример запроса:

SELECT Department, Salary, CUME_DIST(Salary) OVER (PARTITION BY Department ORDER BY Salary)FROM Test_WF.test_structureWHERE Department = \\\'Finance\\\'

Результат запроса: Часть результата запроса, касающаяся финансового отдела, является отдельным окном, так как мы указали PARTITION BY Department, и в качестве расчетного поля указали Salary. Также задали сортировку по полю Salary, рассчитали значения столбца f0_, который показывает значения, возвращенные функцией CUME_DIST. В финансовом отделе, как вы видите, четыре записи, из которых три уникальны по полю Salary (3000, 3900, 6700). В связи с этим значения были рассчитаны следующим образом:

  • 1 / 4 = 0,25 (1 строка окна делится на общее количество строк в окне) ;
  • 3 / 4 = 0,75 (количество предыдущих строк окна — это 1 + 2, так как значение второй строки окна (3900) встречается дважды. Делится на общее количество строк окна — 4.
  • Расчет третьей строки полностью идентичен второй строке. Значение поля Salary в них одинаковое.
  • 4 / 4 = 1 (количество предыдущих значений — 3 плюс 1, так как значение новой строки уникально и ранее учтено не было. Делится на общее количество значений данного окна.

3. Функция DENSE_RANK()

Возвращает ранг значения текущей строки относительно значений всего окна, исходя из заданной сортировки. Для данной функции описание сортировки в пункте OVER с помощью ORDER BY обязательно. Пример запроса:

SELECTDepartment,Salary,DENSE_RANK(Salary) OVER (PARTITION BY Department ORDER BY Salary)FROM Test_WF.test_structureWHERE Department in (\\\'Finance\\\',\\\'Sales\\\')

Результат запроса: Как видим, результат запроса вернул ранг значения каждой строки относительно окна. В данном случае таблица состоит из двух окон Department = ‘Finance’ и Department = ‘Sales’.

4. Функция FIRST_VALUE(field_name)

Возвращает значение первой строки окна, согласно указанной сортировке. При этом для данной функции описание ORDER BY не обязательно. Пример запроса:

SELECTDepartment,Salary,FIRST_VALUE(Salary) OVER (PARTITION BY Department) FROM Test_WF.test_structureWHERE Department in (\\\'Finance\\\',\\\'Sales\\\')

Результат запроса: Функция вернула первое значение поля Salary для каждого окна. То, что это значение самое большое, просто совпадение в данном случае. Так как мы не задавали сортировку, функция вернула просто значение из первой строки окна.

5. Функция LAG

Синтаксис:

LAG (field_name[, offset[, default_value]])

 Возвращает значение строки по указанному полю, при этом поле смещено на указанное в функции количество строк до текущей строки. Если строка не найдена будет возвращено значение по умолчанию заданное в , значение по умолчанию обязательно должно иметь формат INT64, то есть указано с помощью функции INTEGER(expr). Пример запроса:

SELECTDepartment,Salary,LAG(Salary, 2) OVER (PARTITION BY Department)FROM Test_WF.test_structureWHERE Department in (\\\'Finance\\\',\\\'Sales\\\')

 Результат запроса: Функция LAG вернула значение со смещением на 2 строки вверх относительно текущей строки. Таким образом было возвращено значение 6700 в строку 3, полученное из поля Salary строки 1.

6. Функция LAST_VALUE(field_name)

По смыслу функция похожа на функцию FIRST_VALUE, но в данном случае функция возвращает значение из последней строки окна. Пример запроса:

SELECTDepartment,Salary,LAST_VALUE(Salary) OVER (PARTITION BY Department)FROM Test_WF.test_structureWHERE Department in (\\\'Finance\\\',\\\'Sales\\\')

Результат запроса: В строках 1-4 функция вернула значение 3000, так как это значение находится в последней строке окна ‘Finance’. В строках 5-11 мы получили значение 3800, так как оно находится в последней строке окна ‘Sales’.

7. Функция LEAD

Синтаксис:

(expr [, offset[, default_value]])

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

SELECTDepartment,Salary,LEAD(Salary, 2, INTEGER(0)) OVER (PARTITION BY Department)FROM Test_WF.test_structureWHERE Department in (\\\'Finance\\\',\\\'Sales\\\')

 Результат запроса: В первой строке функция вернула значение 3900, так как это значение получено из третьей строки, которая находится на указанное количество строк (2) дальше после текущей, первой строки. Аналогично во второй строке функция вернула значение 3000 из четвертой строки.

8. Функция NTH_VALUE(expr, n)

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

SELECTDepartment,Salary,NTH_VALUE(Salary, 2) OVER (PARTITION BY Department)FROM Test_WF.test_structureWHERE Department in (\\\'Finance\\\',\\\'Sales\\\')

 Результат запроса: В строках 1-4 функция вернула значение 3900, так как в качестве индекса мы указали 2. Cоответственно, значение второй строки окна «Finance» содержит 3900. Аналогично для окна «Sales». Функция вернула 4000, так как вторая строка этого окна, или шестая строка нашей таблицы, содержит значение 4000.

9. Функция NTILE(num_buckets)

Делит окно на заданное в num_buckets количество одинаковых по количеству строк разделов и возвращает номер раздела окна для каждой строки. Пример запроса:

SELECTDepartment,Salary,NTILE(4) OVER (PARTITION BY Department)FROM Test_WF.test_structureWHERE Department in (\\\'Finance\\\',\\\'Sales\\\')

 Результат запроса: Поскольку в пункте OVER в опции PARTITION BY в качестве разделителя окон мы указали Department, функция разбила нашу таблицу на два окна (в фильтре WHERE мы указали два отдела «Finance» и «Sales»). Далее функция NTILE разбила каждое окно на указанное количество разделов. Мы указали четыре раздела. Первое окно «Finance» имеет всего четыре строки, соответственно, каждая строка окна является отделом, и каждой строке данного окна был присвоен свой номер раздела. Окно «Sales» содержит 7 строк. Если разбить 7 строк на 4 раздела, получится, что почти все разделы, кроме последнего, будут состоять из двух строк. Соответственно, строки 5 и 6 — это первый раздел окна Sales, 7-8 строка — второй раздел, 9-10 строки — третий, и последний, четвертый раздел, содержит всего одну — 11 строку.

10. Функция PERCENT_RANK()

Возвращает ранг текущей строки относительно других строк раздела в процентом выражении. Возвращает значение от 0 до 1 включительно, первое значение окна всегда равно 0.0, последние 1.0. Для данной функции описание ORDER BY обязательно. Пример запроса:

SELECTDepartment,Salary,PERCENT_RANK(Salary) OVER (PARTITION BY Department ORDER BY Salary)FROM Test_WF.test_structureWHERE Department in (\\\'Finance\\\',\\\'Sales\\\')

 Результат запроса: Каждая первая строка окна имеет нулевой индекс. Индекс каждой следующей строки увеличивается в случае, если значение поля, указанного в функции, уникально для количества предыдущих строк, в которых значения повторялись. Если значение повторяется, то и индекс для расчета также повторяется. Соответственно, последняя строка окна имеет индекс количества строк равный единице. Давайте более детально рассмотрим расчет для каждой строки окна «Sales». Общее количество строк в данном окне — 7, то есть индекс последней — это 7-1 = 6. Первая строка всегда имеет индекс 0. Расчет пятой строки, или первой строки окна «Sales», происходит по формуле:

Индекс текущей строки / индекс последней строки. В нашем случае 0/6 = 0.0.

Шестая строка содержит новое уникальное значение поля Salary. Индекс данной строки в этом случае рассчитывается так же, как индекс предыдущей, плюс один пункт, и равен единице. Следовательно, функция вернет значение по формуле:

индекс текущей строки / индекс последней строки. В нашем случае 1 / 6 = 0.16.

Поскольку значение в строке 7 повторяется, то и индекс для этой строки так же повторяется и будет равен 1. Соответственно, функция вернет значение 1 / 6 = 0.16. Восьмая строка вновь содержит уникальное значение. Её индекс должен быть увеличен относительно индекса прошлой строки на количество тех предыдущих строк, в которых значение повторялось. В нашем случае значение 3600 повторялось в двух предыдущих строках. Значит, индекс прошлой первой строки мы должны увеличить на 2 и получить индекс восьмой строки равный 3. Расчет значения будет 3 / 6 = 0.5. Девятая строка также содержит новое значение, 4000. Увеличиваем индекс на 1, так как значение прошлой строки не повторялось и содержится только в одной строке. Индекс текущей строки — 3 + 1 = 4, а значение, которое возвращает функция: 4 / 6 = 0.66. Десятая строка содержит такое же значение поля Salary, как и предыдущая. Соответственно, индекс остается 4 и значение поля рассчитывается так: 4 / 6 = 0.66. Одиннадцатая строка содержит новое значение, равное 4800, поскольку прошлое значение поля Salary повторялось. Дважды увеличиваем индекс на 2. 4 + 2 = 6. Значение поля, возвращаемое функцией PERCENT_RANK: 6 / 6 = 1.0

11. Функция PERCENTILE_CONT(percentile)

Возвращает значения, основанные на линейной интерполяции между значениями группы, после сортировки, описанной в пункте ORDER BY. Процентиль должен иметь значение в диапазоне от 0 до 1. Для данной функции описание пункта ORDER BY обязательно. Пример запроса:

SELECTDepartment,Salary,PERCENTILE_CONT(0.5) OVER (PARTITION BY Department ORDER BY Salary)FROM Test_WF.test_structureWHERE Department in (\\\'Finance\\\',\\\'Sales\\\')

 Результат запроса: Поскольку мы в качестве процентиля указали 0,5, в нашем случае он будет равен медиане и возвращает значение медианы. Вы можете указать любой процентиль в интервале от 0 до 1. К примеру, значение 0,25 будет соответствовать второму квартилю, а значение 0,75 — третьему квартилю.

12. Функция PERCENTILE_DISC(percentile)

Возвращает значение с наименьшим кумулятивным распределением, большее или равное указанному в процентилю. Для данной функции описание пункта ORDER BY обязательно. Пример запроса:

SELECTDepartment,Salary,PERCENTILE_DISC(0.25) OVER (PARTITION BY Department ORDER BY Salary) FROM Test_WF.test_structureWHERE Department in (\\\'Finance\\\',\\\'Sales\\\')

 Результат запроса: Функция возвращает значение, соответствующее указанному процентилю. Поскольку мы указали в качестве процентиля 0,25, функция вернула значение первого квартиля. Значение 0,5 вернет значение второго квартиля, который, в свою очередь, равен медиане. Значение 0,75 вернет значение третьего квартиля.

13. Функция RANK()

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

Если вам необходимо получить непрерывное ранжирование, используйте функцию DENSE_RANK ().

Параметр ORDER BY в пункте OVER для данной функции обязательно. Пример запроса:

SELECTDepartment,Salary,RANK(Salary) OVER (PARTITION BY Department ORDER BY Salary)FROM Test_WF.test_structureWHERE Department in (\\\'Finance\\\',\\\'Sales\\\')

 Результат запроса: Как функция рассчитала ранг для окна «Finance»? Наименьшее значение находится в первой строке и равняется 3000, оно имеет первый ранг. Далее во второй и третьей строках идет равнозначное значение 3900. Обе строки имеют ранг 2. Так как ранг 2 повторялся дважды, то ранг следующего значения, находящегося в четвертой строке, увеличивается на 2 относительного ранга в строке 3 и равняется 4.

14. Функция RATIO_TO_REPORT()

Возвращает отношение текущего значения к сумме значений указанного поля в данном окне. Пример запроса:

SELECTDepartment,Salary,RATIO_TO_REPORT(Salary) OVER (PARTITION BY Department ORDER BY Salary)FROM Test_WF.test_structureWHERE Department in (\\\'Finance\\\',\\\'Sales\\\')

 Результат запроса: Для первой строки мы берем текущее значение, то есть 3000, и делим на сумму всех значений окна (3000+3900+3900+6700). Получаем 0,17, то есть значение первой строки составляет 17% от суммы значений всего окна «Finance».

15. Функция ROW_NUMBER()

Возвращает номер текущей строки в окне. Нумерация начинается с единицы. Пример запроса:

SELECTDepartment,Salary,ROW_NUMBER() OVER (PARTITION BY Department)FROM Test_WF.test_structureWHERE Department in (\\\'Finance\\\',\\\'Sales\\\')

Результат запроса: Работа данной функции достаточно проста. Функция просто возвращает номер строки в окне. На первый взгляд, оконные функции могут показаться сложными. Но, потратив немного времени и разобравшись с их немногочисленными настройками, описанными в этой статье, вы значительно расширите свои навыки работы с различными базами данных. Этот тип функций поддерживается не только в BigQuery. Большая часть описанных функций с сохранением описанного выше синтаксиса работает и в PostgreSQL, и в MS SQL, а также в других достаточно известных системах управления базами данных. Если остались вопросы, готов разъяснить в комментариях.

Читайте статью по теме: «Интеграция Google BigQuery с BI-платформами и электронными таблицами».



Комментарии:

Как METRO отказалась от печатных каталогов

Как METRO отказалась от печатных каталогов Как METRO Cash & Carry Украина нашла индивидуальный подход к 1 000 000 клиентов....

14 07 2024 22:58:50

Как выбрать трекер для мобильного приложения — часть вторая

Как выбрать трекер для мобильного приложения — часть вторая Трекеры теперь на любой вкус: за лидерство в сфере аналитики и трекинга в мире мобильных приложений все еще конкурируют более десяти различных систем. Как не растеряться в обилии инструментов?...

13 07 2024 6:17:25

Как собрать данные из Google Search Console и построить отчетность с помощью Python и Google BigQuery

Как сохранить статистику переходов из органики Google, а также автоматизировать отчетность: подробное руководство для технического специалиста....

12 07 2024 22:42:21

Отчет «Статистика аукционов» в Google Рекламе

Отчет «Статистика аукционов» в Google Рекламе Пpaктика в режиме «рейтинг онлайн». Новинка Google Рекламы — отчет «Статистика аукционов»....

11 07 2024 13:17:11

Как не слить бюджет при запуске контекстной рекламы

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

10 07 2024 20:55:48

Краткое пособие для новичков по типам рекламных кампаний в Google Ads

Краткое пособие для новичков по типам рекламных кампаний в Google Ads Google Adwords: типы рекламных кампаний и объявлений, тонкостях настройки... Все, о чем вы боялись спросить... Или не боялись, а просто не знали, о чем спрашивать....

09 07 2024 14:18:13

Как сделать SPA-сайты SEO-Friendly?

Как сделать SPA-сайты SEO-Friendly? Всем, кто собирается перейти на Single Page Application, но переживает, что они поссорятся с поисковыми системами. Правильно переживаете!...

08 07 2024 10:57:24

От хорошего к великому

От хорошего к великому Большой проект Джима Коллинза и его комaнды. Одна из лучших книг в нашей библиотеке. Всем рекомендуется к прочтению!...

07 07 2024 12:16:56

Обзор: четыре новинки в Instagram

Обзор: четыре новинки в Instagram Десктопная версия, совместная работа (collabs), сбор средств и новые эффекты в Reels. Рассказываем, что дают новые функции. Узнать больше....

06 07 2024 15:52:18

Как новичку разобраться в регулярных выражениях

Как новичку разобраться в регулярных выражениях Пора принять решение! Разберитесь с регулярными выражениями для более продуктивной работы с Google ***ytics или Google Tag Manager...

05 07 2024 6:15:43

Как анализировать эффективность рекламы в Google ***ytics? Часть вторая: пользовательские отчеты

Как анализировать эффективность рекламы в Google ***ytics? Часть вторая: пользовательские отчеты Пример пользовательских отчетов в Google ***ytics, созданных за 15 минут...

04 07 2024 11:48:58

Как запустить контекстную рекламу в Японии и не сойти с ума

Как вести успешную рекламную кампанию в Японии, не зная языка....

03 07 2024 13:18:58

Как работать с оператором «квадратные скобки» в Вордстат?

Как работать с оператором «квадратные скобки» в Вордстат? Как пользоваться выбором высокочастотных фраз для метатегов, чисткой мусорных фраз и как расставлять приоритеты для навигационных запросов с указанием определенного направления...

02 07 2024 13:33:50

Как добавить микроразметку с помощью Google Tag Manager

Как добавить микроразметку с помощью Google Tag Manager Стоит установить и освоить Google Tag Manager для расширения представления сайта в выдаче...

01 07 2024 14:14:29

Как загрузить данные из API Google ***ytics в R: часть 2

Пример использования пакета google***yticsR от Марка Эдмондса...

30 06 2024 23:32:20

Как платить за рекламные аккаунты в Украине, России и Казахстане

Как платить за рекламные аккаунты в Украине, России и Казахстане Подробно об оплате аккаунтов и налогообложении рекламы в Украине, России, Казахстане....

29 06 2024 10:54:36

Неочевидные причины блокировки аккаунта в Google Merchant Center

Неочевидные причины блокировки аккаунта в Google Merchant Center Как без проблем пересылать данные в Google Покупки....

28 06 2024 14:39:23

Продвижение мобильного приложения — шпаргалка для строителей воронок продаж

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

27 06 2024 0:30:19

Продвижение интернет-магазина с помощью Google Рекламы: первые шаги

Продвижение интернет-магазина с помощью Google Рекламы: первые шаги Какие типы кампаний и ключевых слов стоит первыми запускать в Google Рекламе? Советы новичкам...

26 06 2024 16:15:19

Как заявить права на сайт в Google Merchant Center

Как заявить права на сайт в Google Merchant Center Здесь не нужно часами собирать семантику, прописывать уйму расширений и создавать максимально релевантные объявления под каждый товар, а потому вам нужен этот понятный и короткий мануал! Читайте дальше!...

25 06 2024 9:24:52

Бизнес и экология. В компании Herman Miller наняли на работу пчёл

Бизнес и экология. В компании Herman Miller наняли на работу пчёл Сортировка мусора, использование велосипедов вместо автомобилей, озеленение города... В Украине, как правило, так представляют экофрендли бизнес. Зарубежные компании идут дальше....

24 06 2024 10:14:43

Сколько стоил клик в Google Ads в первом квартале 2017

Сколько стоил клик в Google Ads в первом квартале 2017 Анализ цены за клик в 25 тематиках и 852 городах Украины, России, Казахстана, Болгарии...

23 06 2024 14:46:21

Как настроить Facebook Business Manager для удобной работы

Facebook + Instagram, Business Manager + основная бизнес-страница на Facebook, BM + рекламный аккаунт и так далее....

22 06 2024 14:31:57

Как отслеживать трафик PBN-сайтов

Как отслеживать трафик PBN-сайтов Если в сетке сайтов есть интересный домен, его можно использовать для дополнительной монетизации, а не только для ссылок. В таком случае важно знать, как правильно отслеживать трафик таких доменов....

21 06 2024 4:25:27

Как повысить коэффициент конверсии с помощью лендинга? — кейс Rawai VIP Villas

Как повысить коэффициент конверсии с помощью лендинга? — кейс Rawai VIP Villas Если ваш сайт не приносит желаемых продаж, задумайтесь о смене формата. Этот кейс о том, как с качественным лендингом можно достигнуть желаемой цены за конверсию....

20 06 2024 19:48:53

Как настроить расширенную электронную торговлю с помощью Google Tag Manager

Как настроить расширенную электронную торговлю с помощью Google Tag Manager Как GTM помогает настроить расширенную электронную торговлю (enhanced ecommerce)....

19 06 2024 4:11:35

Как работать с Яндекс.Вебвизор 2.0

Как работать с Яндекс.Вебвизор 2.0 Бета-версия помогает записывать действия пользователей на сайте и благодаря этому улучшать удобство использования сайта и в перспективе растить продажи. Узнать больше!...

18 06 2024 21:25:42

Как продвигать мобильное приложение: опыт Андреаса Рётля на примере Journi

Как продвигать мобильное приложение: опыт Андреаса Рётля на примере Journi Андреас Рётль о продвижении Journi: как трое выпускников Стэнфордского университета создали приложение для сторителлинга с 25 000 пользователями в 100 странах....

17 06 2024 6:58:36

Влияют ли негативные комментарии на эффективность рекламы в Facebook? Тест на $1000

Помогают ли комментарии повысить эффективность рекламных постов? Единственный способ выяснить наверняка — провести A/B-тестирование в Facebook. Спойлер: тональность комментария также имеет значение в Facebook...

16 06 2024 0:22:40

Обновление Яндекс.Директ Коммaндер — обзор бета-версии

Обновление Яндекс.Директ Коммaндер — обзор бета-версии В конце октября Яндекс начал открытое бета-тестирование новой версии Коммaндера. Я решила уже сейчас проверить все плюсы и минусы новой версии сервиса...

15 06 2024 22:38:32

Рекламные кампании для масштабирования бизнеса в интернете

Рекламные кампании для масштабирования бизнеса в интернете Главные вопросы при запуске и настройке любых кампаний: «чего я хочу достичь?», «помогает ли текущая кампания достичь желаемых результатов?», «влияет ли кампания на эффективность других кампаний и источников?». Узнать больше....

14 06 2024 13:26:45

Сколько стоил клик в Google Ads в Украине в третьем квартале 2021 года

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

13 06 2024 9:35:15

Пять вопросов для проверки софт-скиллз в IT

Пять вопросов для проверки софт-скиллз в IT Как узнать, что потенциальный сотрудник креативный, умеет убеждать, работать в комaнде, адаптироваться к быстрой смене условий, владеет эмоциональным интеллектом? Вопросы для проверки этих софт-скиллов здесь....

12 06 2024 3:14:51

Как оптимизировать контент: title, h1, description, keywords

Как оптимизировать контент: title, h1, description, keywords Грамотно оформленные метатеги презентуют сайт, помогают пользователям быстро найти нужную информацию, а поисковым системам — повысить ресурс в выдаче...

11 06 2024 18:12:51

Как работать с Google Trends — подробное руководство для новичков

Как работать с Google Trends — подробное руководство для новичков Успех рекламы во многом зависит от сезонности, популярности тематики и умения оперативно среагировать на тренд. Для этого и существует сервис Google Trends....

10 06 2024 10:18:35

Рекламные кампании в LinkedIn: как настроить отслеживание конверсии

Рекламные кампании в LinkedIn: как настроить отслеживание конверсии Метод настройки с помощью Google Tag Manager. Мануал с подробным описанием каждого шага — показываем на примере, как отслеживать веб-конверсии в рекламных кампаниях LinkedIn. Узнать больше!...

09 06 2024 19:48:25

Как быстро и бесплатно импортировать в Google Таблицы статистику из Facebook

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

08 06 2024 7:55:38

Facebook ***ytics — подробное руководство по настройке

Как работать с Facebook ***ytics — бесплатным инструментом с богатым инструментарием и лучшей из всех существующих решений интеграцией с платформой Facebook...

07 06 2024 10:27:54

Контекстная реклама интернет-магазина автотоваров — как снизить траты и увеличить ROMI на 772%

Контекстная реклама интернет-магазина автотоваров — как снизить траты и увеличить ROMI на 772% Изучаем на примере тестирования товарных кампаний в момент смены логотипа и ренейминга...

06 06 2024 1:43:29

15+ Telegram-каналов о бизнесе, обучении, маркетинге, веб-аналитике, SEO, путешествиях

15+ Telegram-каналов о бизнесе, обучении, маркетинге, веб-аналитике, SEO, путешествиях Полезный и развлекательный контент для всех, кто работает в IT, интернет-маркетинге, интересуется фишками тайм-менеджмента, учится управлять комaндой и собой....

05 06 2024 18:37:45

Лучшие дополнения для Google Docs

Лучшие дополнения для Google Docs Оптимизация и оформление вордовских текстов, переводчик, совместное редактирование, возможность залить картинку... Эти и много других опций дают дополнения для Google Документов....

04 06 2024 13:27:32

Как работает Google Marketing Platform — подробная инструкция

Как работает Google Marketing Platform — подробная инструкция Нужно ли начинать работу с Google Marketing Platform, и если да, то на каком этапе развития бизнеса?...

03 06 2024 2:11:42

Отзыв про курсы продвижения сайтов от Netpeak

Отзыв про курсы продвижения сайтов от Netpeak Виктория Игнатьева рассказала про опыт обучения на наших курсах....

02 06 2024 0:44:29

Стратегия ведения контекстной рекламы по воронке продаж на примере SaaS: шаблон и инструкция

Стратегия ведения контекстной рекламы по воронке продаж на примере SaaS: шаблон и инструкция Как найти индивидуальный подход к аудитории на каждом этапе воронки продаж? В этом вам поможет правильно составленная стратегия контекстной рекламы....

01 06 2024 5:34:37

Как с помощью Google Earth собрать контакты для email-рассылок и холодных звонков

Как с помощью Google Earth собрать контакты для email-рассылок и холодных звонков Проверенный способ для сбора базы данных. Метод, с помощью которого можно извлечь контактные данные, а именно: название точки, телефон, адрес, сайт., а потом высылать своё КП, промокоды для акции, сообщить о выходе товара, сделать спецпредложение...

31 05 2024 13:47:35

Почему мы играем или не играем в игры

Почему мы играем или не играем в игры Николь Лаззаро из XEODesign провела исследование о том, почему мы играем или не играем в игры....

30 05 2024 19:10:29

Главные инструменты увеличения продаж в интернет-магазине

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

29 05 2024 13:15:27

Как и когда выходить на рынки других стран — советы Google

Как и когда выходить на рынки других стран — советы Google Менеджер экспортного направления Гугл Украина — об особенностях выхода на рынки разных стран мира....

28 05 2024 5:29:19

Как работать с репутацией медицинского бренда в интернете — кейс Synevo

Как работать с репутацией медицинского бренда в интернете — кейс Synevo Как работать с негативом и что делать, чтобы его было меньше/не было вовсе....

27 05 2024 5:37:31

Как связать Twitter, Google Buzz, Facebook и Vkontakte.ru

Как связать Twitter, Google Buzz, Facebook и Vkontakte.ru Как сделать так, чтобы статусы автоматически трaнcлировались в Twitter...

26 05 2024 5:43:50

Еще:
понять и запомнить -1 :: понять и запомнить -2 :: понять и запомнить -3 :: понять и запомнить -4 :: понять и запомнить -5 :: понять и запомнить -6 :: понять и запомнить -7 ::