{"id":7680,"date":"2019-09-20T12:55:31","date_gmt":"2019-09-20T19:55:31","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=7680"},"modified":"2025-06-13T17:21:53","modified_gmt":"2025-06-14T00:21:53","slug":"deep-dive-window-functions-in-couchbase-analytics","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/deep-dive-window-functions-in-couchbase-analytics\/","title":{"rendered":"Mergulho profundo: Fun\u00e7\u00f5es de janela no Couchbase Analytics"},"content":{"rendered":"<p><span style=\"font-weight: 400\">O Couchbase Server 6.5 traz uma s\u00e9rie de <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/announcing-couchbase-server-6-5-0-beta-whats-new-and-improved\/\"><span style=\"font-weight: 400\">novos recursos<\/span><\/a><span style=\"font-weight: 400\"> [<a href=\"#ref1\">1<\/a>...] para o principal banco de dados NoSQL. <\/span><span style=\"font-weight: 400\">Uma das principais adi\u00e7\u00f5es \u00e0 linguagem de consulta N1QL \u00e9 o suporte a fun\u00e7\u00f5es de janela.\u00a0<\/span><span style=\"font-weight: 400\">Essas fun\u00e7\u00f5es foram originalmente introduzidas no padr\u00e3o SQL:2003 e oferecem uma maneira eficiente de responder a muitas consultas comerciais complexas. As fun\u00e7\u00f5es Window foram discutidas anteriormente na s\u00e9rie de <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/tag\/analytical-functions\/\"><span style=\"font-weight: 400\">postagens<\/span><\/a><span style=\"font-weight: 400\"> [<a href=\"#ref2\">2<\/a>], [<a href=\"#ref3\">3<\/a>], [<a href=\"#ref4\">4<\/a>] e, nesta parte, vamos nos aprofundar em sua implementa\u00e7\u00e3o no Couchbase Analytics.<\/span><\/p>\n<p><span style=\"font-weight: 400\">O <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/announcing-couchbase-6-0\/\"><span style=\"font-weight: 400\">Servi\u00e7o do Couchbase Analytics<\/span><\/a><span style=\"font-weight: 400\"> [<a href=\"#ref5\">5<\/a>O Couchbase\u00ae foi projetado para lidar com consultas ad-hoc complexas na plataforma de dados do Couchbase. Seu principal componente \u00e9 o mecanismo de consulta MPP, que \u00e9 executado em um conjunto separado de n\u00f3s no cluster para garantir o isolamento da carga de trabalho dos n\u00f3s de dados operacionais. Os dados s\u00e3o ingeridos no Analytics usando o <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbases-history-everything-dcp\/\"><span style=\"font-weight: 400\">Protocolo de altera\u00e7\u00e3o de DCP<\/span><\/a><span style=\"font-weight: 400\"> [<a href=\"#ref6\">6<\/a>] e \u00e9 particionado por hash entre todos os n\u00f3s do Analytics dispon\u00edveis. O processador de consultas MPP divide uma \u00fanica consulta em subtarefas e as programa para serem executadas em paralelo em todos os n\u00f3s, reparticionando os dados, se necess\u00e1rio. Mais informa\u00e7\u00f5es sobre a arquitetura geral do servi\u00e7o est\u00e3o dispon\u00edveis em nosso recente <\/span><a href=\"https:\/\/www.vldb.org\/pvldb\/vol12\/p2275-hubail.pdf\"><span style=\"font-weight: 400\">Papel do VLDB 2019<\/span><\/a><span style=\"font-weight: 400\"> [<a href=\"#ref7\">7<\/a>] e em nosso <\/span><a href=\"https:\/\/www.youtube.com\/watch?v=1dN11TUj58c\"><span style=\"font-weight: 400\">canal de v\u00eddeo<\/span><\/a><span style=\"font-weight: 400\"> [<a href=\"#ref8\">8<\/a>].<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-7681 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/09\/HTAP.png\" alt=\"Figure 1: Couchbase Analytics Service\" width=\"729\" height=\"422\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/HTAP.png 729w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/HTAP-300x174.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/HTAP-20x12.png 20w\" sizes=\"auto, (max-width: 729px) 100vw, 729px\" \/><\/p>\n<p style=\"text-align: center\"><strong>Figura 1: Servi\u00e7o de an\u00e1lise do Couchbase<\/strong><\/p>\n<p><span style=\"font-weight: 400\">As fun\u00e7\u00f5es de janela tamb\u00e9m s\u00e3o avaliadas de forma distribu\u00edda e paralela \u00e0 parti\u00e7\u00e3o pelo mecanismo de consulta do Analytics. O compilador de consultas cria um plano de execu\u00e7\u00e3o que cont\u00e9m v\u00e1rios operadores trabalhando juntos para computar o resultado da chamada da fun\u00e7\u00e3o de janela. Esse plano de execu\u00e7\u00e3o \u00e9 ent\u00e3o enviado a todos os n\u00f3s do Analytics no cluster, onde cada operador trabalha em uma parti\u00e7\u00e3o dos dados de entrada. O mecanismo de execu\u00e7\u00e3o coordena a execu\u00e7\u00e3o do operador e fornece o resultado da consulta ao cliente. Por exemplo, considere a seguinte consulta que classifica os funcion\u00e1rios de cada departamento de acordo com seus sal\u00e1rios.<\/span><\/p>\n<pre class=\"top-margin:24 bottom-margin:24 whitespace-before:1 whitespace-after:1 lang:plsql decode:true\">SELECT RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank, \r\n       employee_id, department_id, salary\r\nFROM employee<\/pre>\n<p><span style=\"font-weight: 400\">O processador de consultas avalia essa fun\u00e7\u00e3o em tr\u00eas etapas, conforme ilustrado na Figura 2.<\/span><\/p>\n<p style=\"text-align: center\">\u00a0<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-7682 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/09\/CBASDeepDiveWinFunFigure2.png\" alt=\"Figure 2: Distributed, parallel query execution of window functions\" width=\"880\" height=\"416\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/CBASDeepDiveWinFunFigure2.png 880w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/CBASDeepDiveWinFunFigure2-300x142.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/CBASDeepDiveWinFunFigure2-768x363.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/CBASDeepDiveWinFunFigure2-20x9.png 20w\" sizes=\"auto, (max-width: 880px) 100vw, 880px\" \/><\/p>\n<p style=\"text-align: center\"><strong>Figura 2: Execu\u00e7\u00e3o de consulta paralela e distribu\u00edda de fun\u00e7\u00f5es de janela<\/strong><\/p>\n<ol>\n<li><span style=\"font-weight: 400\">Depois que os dados s\u00e3o selecionados do conjunto de dados de funcion\u00e1rios, eles s\u00e3o reparticionados de acordo com a subcl\u00e1usula PARTITION BY da cl\u00e1usula OVER. O layout de dados inicial pode ter cada um dos registros de departamento espalhados por diferentes parti\u00e7\u00f5es de armazenamento em v\u00e1rios n\u00f3s do Analytics. Ap\u00f3s a etapa de reparticionamento, todos os registros de funcion\u00e1rios de um \u00fanico departamento chegam \u00e0 mesma parti\u00e7\u00e3o de computa\u00e7\u00e3o. A etapa de reparticionamento \u00e9 executada em paralelo em todos os n\u00f3s\/parti\u00e7\u00f5es do cluster. Na configura\u00e7\u00e3o mais comum do Analytics, h\u00e1 uma rela\u00e7\u00e3o de um para um entre o n\u00famero de parti\u00e7\u00f5es de dados e o n\u00famero de n\u00facleos de CPU dispon\u00edveis no cluster.<\/span><\/li>\n<li><span style=\"font-weight: 400\">Os registros de cada departamento s\u00e3o classificados de acordo com a subcl\u00e1usula ORDER BY da cl\u00e1usula OVER. Quando os registros de cada departamento chegam \u00e0s parti\u00e7\u00f5es de computa\u00e7\u00e3o correspondentes, o processador de consultas come\u00e7a a classificar os dados. Essa etapa de classifica\u00e7\u00e3o tamb\u00e9m \u00e9 executada em paralelo em todos os n\u00f3s do Analytics.<\/span><\/li>\n<li><span style=\"font-weight: 400\">A fun\u00e7\u00e3o RANK() \u00e9 ent\u00e3o computada em registros classificados dentro de cada departamento. Essa fun\u00e7\u00e3o espec\u00edfica s\u00f3 precisa examinar o registro atual e compar\u00e1-lo com o anterior, portanto, pode ser avaliada de forma cont\u00ednua sem exigir materializa\u00e7\u00e3o de dados adicional.<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400\">A execu\u00e7\u00e3o dessas etapas em paralelo em todos os n\u00f3s dispon\u00edveis permite que o Analytics utilize todos os recursos computacionais do cluster. Isso permite que o Analytics obtenha escalabilidade linear \u00e0 medida que mais n\u00f3s s\u00e3o adicionados para atender \u00e0s metas de desempenho necess\u00e1rias.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Vamos ver como os est\u00e1gios acima podem ser identificados em um plano de execu\u00e7\u00e3o de consulta. O recurso Analytics explain plan foi descrito em um <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/analytics-explain-plan-part-1\/\"><span style=\"font-weight: 400\">post anterior<\/span><\/a><span style=\"font-weight: 400\"> [<a href=\"#ref9\">9<\/a>], portanto, aqui nos concentramos apenas no fragmento do plano relacionado \u00e0 avalia\u00e7\u00e3o da fun\u00e7\u00e3o de janela. (Lembre-se de que os planos de consulta do Analytics devem ser lidos de baixo para cima).<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-7687 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/09\/CBASDeepDiveWinFunFigure3v2-e1569011246976.png\" alt=\"Figure 3: Fragment of the query execution plan\" width=\"861\" height=\"826\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/CBASDeepDiveWinFunFigure3v2-e1569011246976.png 861w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/CBASDeepDiveWinFunFigure3v2-e1569011246976-300x288.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/CBASDeepDiveWinFunFigure3v2-e1569011246976-768x737.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/09\/CBASDeepDiveWinFunFigure3v2-e1569011246976-20x20.png 20w\" sizes=\"auto, (max-width: 861px) 100vw, 861px\" \/><\/p>\n<p style=\"text-align: center\"><strong>Figura 3: Fragmento do plano de execu\u00e7\u00e3o da consulta<\/strong><\/p>\n<p><span style=\"font-weight: 400\">Os dados s\u00e3o lidos do conjunto de dados do funcion\u00e1rio pelo operador \"data-scan\" e s\u00e3o passados para o operador \"exchange\", que \u00e9 respons\u00e1vel pelo reparticionamento dos dados. O campo de reparti\u00e7\u00e3o \u00e9 \"department_id\", conforme solicitado pela subcl\u00e1usula PARTITION BY. Em seguida, o operador \"order\" classifica os dados de acordo com a subcl\u00e1usula ORDER BY. Por fim, o operador \"window-aggregate\" calcula a fun\u00e7\u00e3o RANK(). Observe como o valor de \"physical-operator\" para esse operador est\u00e1 definido como \"WINDOW_STREAM\", o que significa que o operador funciona em um modo de fluxo cont\u00ednuo e n\u00e3o exige nenhuma materializa\u00e7\u00e3o de dados adicional. O campo \"execution-mode\" est\u00e1 definido como \"PARTITIONED\" para todos os operadores, de modo que todos eles ser\u00e3o executados em todas as parti\u00e7\u00f5es de computa\u00e7\u00e3o dispon\u00edveis no cluster.<\/span><\/p>\n<p><span style=\"font-weight: 400\">A avalia\u00e7\u00e3o de algumas fun\u00e7\u00f5es de janela pode exigir informa\u00e7\u00f5es relativas a uma parti\u00e7\u00e3o l\u00f3gica inteira (seu n\u00famero total de tuplas para as fun\u00e7\u00f5es NTILE() e PERCENTILE_RANK(), por exemplo) ou v\u00e1rias itera\u00e7\u00f5es em toda a parti\u00e7\u00e3o (ao calcular quadros de janela para fun\u00e7\u00f5es agregadas). Essas fun\u00e7\u00f5es s\u00e3o processadas por operadores de janela sem fluxo cont\u00ednuo. Um operador de janela sem fluxo \u00e9 identificado pelo valor \"physical-operator\" de \"WINDOW\" no plano de execu\u00e7\u00e3o da consulta. O operador materializa uma parti\u00e7\u00e3o l\u00f3gica de cada vez e, em seguida, inicia o c\u00e1lculo da fun\u00e7\u00e3o de janela para cada tupla nessa parti\u00e7\u00e3o. Para lidar com quantidades arbitr\u00e1rias de dados de entrada, o operador segue o modelo de gerenciamento de mem\u00f3ria do mecanismo de execu\u00e7\u00e3o do Analytics. O planejador de consultas atribui um or\u00e7amento de mem\u00f3ria a cada operador. Esse or\u00e7amento n\u00e3o pode ser excedido durante a execu\u00e7\u00e3o da consulta. Os dados operacionais que ultrapassam o or\u00e7amento s\u00e3o transferidos para o disco por cada operador e lidos de volta mais tarde, quando a mem\u00f3ria estiver dispon\u00edvel. Uma consulta geralmente consiste em v\u00e1rios operadores e, portanto, tem um or\u00e7amento de mem\u00f3ria global que n\u00e3o pode ser excedido no tempo de execu\u00e7\u00e3o. O processador de consultas do Analytics implementa o controle de carga baseado em recursos para consultas de entrada, admitindo apenas aquelas que podem ser executadas dentro da mem\u00f3ria dispon\u00edvel em todos os n\u00f3s.<\/span><\/p>\n<p><span style=\"font-weight: 400\">O N1QL for Analytics tamb\u00e9m imp\u00f5e menos restri\u00e7\u00f5es ao contexto sint\u00e1tico das chamadas de fun\u00e7\u00e3o de janela. Diferentemente do SQL, as consultas no N1QL for Analytics permitem fun\u00e7\u00f5es de janela nas cl\u00e1usulas WHERE e HAVING, bem como nas cl\u00e1usulas LET espec\u00edficas do N1QL.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Nossa consulta original, por exemplo, pode ser facilmente modificada para retornar apenas o funcion\u00e1rio mais bem classificado em cada departamento:<\/span><\/p>\n<pre class=\"whitespace-before:1 whitespace-after:1 lang:plsql decode:true\">SELECT employee_id, department_id, salary\r\nFROM employee\r\nWHERE RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) = 1<\/pre>\n<p><span style=\"font-weight: 400\">Para concluir, as fun\u00e7\u00f5es de janela no Analytics fornecem um mecanismo poderoso para an\u00e1lise e gera\u00e7\u00e3o de relat\u00f3rios de dados paralelos. A linguagem de consulta N1QL do Couchbase permite que os usu\u00e1rios avaliem facilmente essas fun\u00e7\u00f5es diretamente nos dados JSON de seus aplicativos, evitando assim o processamento complexo de ETL.<br \/>\n<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/?family=server&amp;product=couchbase-server-developer\"><span style=\"font-weight: 400\">Fa\u00e7a o download do Couchbase Server 6.5<\/span><\/a><span style=\"font-weight: 400\"> hoje mesmo e entre em contato conosco pelo <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/c\/analytics\/\"><span style=\"font-weight: 400\">F\u00f3runs<\/span><\/a><span style=\"font-weight: 400\"> para quaisquer perguntas ou coment\u00e1rios.<\/span><\/p>\n<h4><span style=\"font-weight: 400\">Refer\u00eancias<\/span><\/h4>\n<p><span style=\"font-weight: 400\"><a id=\"ref1\"><\/a>[1] Anunciando o Couchbase Server 6.5 GA - O que h\u00e1 de novo e aprimorado<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/announcing-couchbase-server-6-5-0-beta-whats-new-and-improved\/\"><span style=\"font-weight: 400\">https:\/\/www.couchbase.com\/blog\/announcing-couchbase-server-6-5-0-whats-new-and-improved\/<\/span><\/a><br \/>\n<span style=\"font-weight: 400\"><a id=\"ref2\"><\/a>[2] Em p\u00e9 de igualdade com as fun\u00e7\u00f5es de janela<\/span><br \/>\n<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/on-par-with-window-functions-in-n1ql\/\"><span style=\"font-weight: 400\">https:\/\/www.couchbase.com\/blog\/on-par-with-window-functions-in-n1ql\/<\/span><\/a><br \/>\n<span style=\"font-weight: 400\"><a id=\"ref3\"><\/a>[3] Obtenha uma vis\u00e3o mais ampla com as fun\u00e7\u00f5es de janela e CTE do N1QL<\/span><br \/>\n<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/get-a-bigger-picture-with-n1ql-window-functions-and-cte\/\"><span style=\"font-weight: 400\">https:\/\/www.couchbase.com\/blog\/get-a-bigger-picture-with-n1ql-window-functions-and-cte\/<\/span><\/a><br \/>\n<span style=\"font-weight: 400\"><a id=\"ref4\"><\/a>[4] Fun\u00e7\u00f5es de janela no Couchbase Analytics<\/span><br \/>\n<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/window-functions-in-couchbase-analytics\/\"><span style=\"font-weight: 400\">https:\/\/www.couchbase.com\/blog\/window-functions-in-couchbase-analytics\/<\/span><\/a><br \/>\n<span style=\"font-weight: 400\"><a id=\"ref5\"><\/a>[5] Anunciando o Couchbase Server 6.0 com Analytics<br \/>\n<\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/announcing-couchbase-6-0\/\"><span style=\"font-weight: 400\">https:\/\/www.couchbase.com\/blog\/announcing-couchbase-6-0\/<\/span><\/a><br \/>\n<span style=\"font-weight: 400\"><a id=\"ref6\"><\/a>[6] A hist\u00f3ria de tudo do Couchbase: DCP<br \/>\n<\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbases-history-everything-dcp\/\"><span style=\"font-weight: 400\">https:\/\/www.couchbase.com\/blog\/couchbases-history-everything-dcp\/<\/span><\/a><br \/>\n<span style=\"font-weight: 400\"><a id=\"ref7\"><\/a>[7] Murtadha Al Hubail, Ali Alsuliman, Michael Blow, Michael Carey, Dmitry Lychagin, Ian Maxon e Till Westmann. Couchbase Analytics: NoETL for Scalable NoSQL Data Analysis. PVLDB, 12(12): 2275-2286, 2019<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><a href=\"https:\/\/www.vldb.org\/pvldb\/vol12\/p2275-hubail.pdf\"><span style=\"font-weight: 400\">https:\/\/www.vldb.org\/pvldb\/vol12\/p2275-hubail.pdf<\/span><\/a><br \/>\n<span style=\"font-weight: 400\"><a id=\"ref8\"><\/a>[8] Couchbase Analytics: Sob o cap\u00f4 - Connect Silicon Valley 2018<br \/>\n<\/span><a href=\"https:\/\/www.youtube.com\/watch?v=1dN11TUj58c\"><span style=\"font-weight: 400\">https:\/\/www.youtube.com\/watch?v=1dN11TUj58c<\/span><\/a><br \/>\n<span style=\"font-weight: 400\"><a id=\"ref9\"><\/a>[9] Plano de explica\u00e7\u00e3o do Analytics - Parte 1<br \/>\n<\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/analytics-explain-plan-part-1\/\"><span style=\"font-weight: 400\">https:\/\/www.couchbase.com\/blog\/analytics-explain-plan-part-1\/<\/span><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Couchbase Server 6.5 brings a host of new features [1] to the leading NoSQL database. One of the key additions to the N1QL query language is support for window functions.\u00a0These functions were originally introduced in the SQL:2003 standard and provide [&hellip;]<\/p>","protected":false},"author":45683,"featured_media":7111,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[2294,1816,1812],"tags":[2378,2306,2304],"ppma_author":[9094],"class_list":["post-7680","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","category-couchbase-server","category-n1ql-query","tag-6-5","tag-analytical-functions","tag-reporting"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Deep Dive: Window functions in Couchbase Analytics - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/deep-dive-window-functions-in-couchbase-analytics\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deep Dive: Window functions in Couchbase Analytics\" \/>\n<meta property=\"og:description\" content=\"Couchbase Server 6.5 brings a host of new features [1] to the leading NoSQL database. One of the key additions to the N1QL query language is support for window functions.\u00a0These functions were originally introduced in the SQL:2003 standard and provide [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/deep-dive-window-functions-in-couchbase-analytics\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-09-20T19:55:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T00:21:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/Couchbase-Flora-Blog-Image-1024x295.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"295\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Dmitry Lychagin, Principal Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dmitry Lychagin, Principal Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/\"},\"author\":{\"name\":\"Dmitry Lychagin, Principal Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2610a4782c51bbd9b2a2f30e08b9dfc3\"},\"headline\":\"Deep Dive: Window functions in Couchbase Analytics\",\"datePublished\":\"2019-09-20T19:55:31+00:00\",\"dateModified\":\"2025-06-14T00:21:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/\"},\"wordCount\":1153,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/Couchbase-Flora-Blog-Image.png\",\"keywords\":[\"6.5\",\"analytical functions\",\"reporting\"],\"articleSection\":[\"Couchbase Analytics\",\"Couchbase Server\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/\",\"name\":\"Deep Dive: Window functions in Couchbase Analytics - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/Couchbase-Flora-Blog-Image.png\",\"datePublished\":\"2019-09-20T19:55:31+00:00\",\"dateModified\":\"2025-06-14T00:21:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/Couchbase-Flora-Blog-Image.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/Couchbase-Flora-Blog-Image.png\",\"width\":2048,\"height\":589},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deep Dive: Window functions in Couchbase Analytics\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2610a4782c51bbd9b2a2f30e08b9dfc3\",\"name\":\"Dmitry Lychagin, Principal Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/1845089d3a8b23cae89dcb7e90a31686\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ee7b03111d3aa598e468501586d3008fcebe423cddf3f065f94acd0213ac8057?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ee7b03111d3aa598e468501586d3008fcebe423cddf3f065f94acd0213ac8057?s=96&d=mm&r=g\",\"caption\":\"Dmitry Lychagin, Principal Engineer, Couchbase\"},\"description\":\"Dmitry is a Principal Engineer working on Couchbase Analytics, focusing on its query compiler and the execution engine. He has more than 15 years of experience building enterprise software at Oracle, BEA Systems, and early-stage startups.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/dmitrylychagin\/\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/dmitry-lychagin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Deep Dive: Window functions in Couchbase Analytics - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/deep-dive-window-functions-in-couchbase-analytics\/","og_locale":"pt_BR","og_type":"article","og_title":"Deep Dive: Window functions in Couchbase Analytics","og_description":"Couchbase Server 6.5 brings a host of new features [1] to the leading NoSQL database. One of the key additions to the N1QL query language is support for window functions.\u00a0These functions were originally introduced in the SQL:2003 standard and provide [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/deep-dive-window-functions-in-couchbase-analytics\/","og_site_name":"The Couchbase Blog","article_published_time":"2019-09-20T19:55:31+00:00","article_modified_time":"2025-06-14T00:21:53+00:00","og_image":[{"width":1024,"height":295,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/Couchbase-Flora-Blog-Image-1024x295.png","type":"image\/png"}],"author":"Dmitry Lychagin, Principal Engineer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Dmitry Lychagin, Principal Engineer, Couchbase","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/"},"author":{"name":"Dmitry Lychagin, Principal Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2610a4782c51bbd9b2a2f30e08b9dfc3"},"headline":"Deep Dive: Window functions in Couchbase Analytics","datePublished":"2019-09-20T19:55:31+00:00","dateModified":"2025-06-14T00:21:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/"},"wordCount":1153,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/Couchbase-Flora-Blog-Image.png","keywords":["6.5","analytical functions","reporting"],"articleSection":["Couchbase Analytics","Couchbase Server","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/","url":"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/","name":"Deep Dive: Window functions in Couchbase Analytics - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/Couchbase-Flora-Blog-Image.png","datePublished":"2019-09-20T19:55:31+00:00","dateModified":"2025-06-14T00:21:53+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/Couchbase-Flora-Blog-Image.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/Couchbase-Flora-Blog-Image.png","width":2048,"height":589},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Deep Dive: Window functions in Couchbase Analytics"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2610a4782c51bbd9b2a2f30e08b9dfc3","name":"Dmitry Lychagin, engenheiro principal, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/1845089d3a8b23cae89dcb7e90a31686","url":"https:\/\/secure.gravatar.com\/avatar\/ee7b03111d3aa598e468501586d3008fcebe423cddf3f065f94acd0213ac8057?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ee7b03111d3aa598e468501586d3008fcebe423cddf3f065f94acd0213ac8057?s=96&d=mm&r=g","caption":"Dmitry Lychagin, Principal Engineer, Couchbase"},"description":"Dmitry is a Principal Engineer working on Couchbase Analytics, focusing on its query compiler and the execution engine. He has more than 15 years of experience building enterprise software at Oracle, BEA Systems, and early-stage startups.","sameAs":["https:\/\/www.linkedin.com\/in\/dmitrylychagin\/"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/dmitry-lychagin\/"}]}},"authors":[{"term_id":9094,"user_id":45683,"is_guest":0,"slug":"dmitry-lychagin","display_name":"Dmitry Lychagin, Principal Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/ee7b03111d3aa598e468501586d3008fcebe423cddf3f065f94acd0213ac8057?s=96&d=mm&r=g","author_category":"","last_name":"Lychagin, Principal Engineer, Couchbase","first_name":"Dmitry","job_title":"","user_url":"","description":"Dmitry \u00e9 engenheiro principal e trabalha no Couchbase Analytics, concentrando-se no compilador de consultas e no mecanismo de execu\u00e7\u00e3o.\r\nEle tem mais de 15 anos de experi\u00eancia na cria\u00e7\u00e3o de software empresarial na Oracle, BEA Systems e em startups em est\u00e1gio inicial."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/7680","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/45683"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=7680"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/7680\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/7111"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=7680"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=7680"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=7680"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=7680"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}