{"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\/es\/deep-dive-window-functions-in-couchbase-analytics\/","title":{"rendered":"Inmersi\u00f3n profunda: Funciones de ventana en Couchbase Analytics"},"content":{"rendered":"<p><span style=\"font-weight: 400\">Couchbase Server 6.5 aporta una serie de <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/announcing-couchbase-server-6-5-0-beta-whats-new-and-improved\/\"><span style=\"font-weight: 400\">novedades<\/span><\/a><span style=\"font-weight: 400\"> [<a href=\"#ref1\">1<\/a>] a la principal base de datos NoSQL. <\/span><span style=\"font-weight: 400\">Una de las principales novedades del lenguaje de consulta N1QL es la compatibilidad con las funciones de ventana.\u00a0<\/span><span style=\"font-weight: 400\">Estas funciones se introdujeron originalmente en el est\u00e1ndar SQL:2003 y proporcionan una forma eficaz de responder a muchas consultas empresariales complejas. Las funciones de ventana se trataron anteriormente en la serie de <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/tag\/analytical-functions\/\"><span style=\"font-weight: 400\">puestos<\/span><\/a><span style=\"font-weight: 400\"> [<a href=\"#ref2\">2<\/a>], [<a href=\"#ref3\">3<\/a>], [<a href=\"#ref4\">4<\/a>], y en esta entrega profundizaremos en su implementaci\u00f3n en Couchbase Analytics.<\/span><\/p>\n<p><span style=\"font-weight: 400\">En <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/announcing-couchbase-6-0\/\"><span style=\"font-weight: 400\">Servicio Couchbase Analytics<\/span><\/a><span style=\"font-weight: 400\"> [<a href=\"#ref5\">5<\/a>est\u00e1 dise\u00f1ado para gestionar consultas ad-hoc complejas en la plataforma de datos Couchbase. Su componente clave es el motor de consultas MPP, que se ejecuta en un conjunto separado de nodos del cl\u00faster para garantizar el aislamiento de la carga de trabajo de los nodos de datos operativos. Los datos se introducen en Analytics mediante el motor de consultas MPP. <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/couchbases-history-everything-dcp\/\"><span style=\"font-weight: 400\">Protocolo de cambio de DCP<\/span><\/a><span style=\"font-weight: 400\"> [<a href=\"#ref6\">6<\/a>] y se reparte entre todos los nodos Analytics disponibles. El procesador de consultas MPP divide una \u00fanica consulta en subtareas y las programa para que se ejecuten en paralelo en todos los nodos, reparticionando los datos si es necesario. Encontrar\u00e1 m\u00e1s informaci\u00f3n sobre la arquitectura general del servicio en nuestra reciente publicaci\u00f3n <\/span><a href=\"https:\/\/www.vldb.org\/pvldb\/vol12\/p2275-hubail.pdf\"><span style=\"font-weight: 400\">Ponencia del VLDB 2019<\/span><\/a><span style=\"font-weight: 400\"> [<a href=\"#ref7\">7<\/a>] y en nuestro <\/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: Servicio Couchbase Analytics<\/strong><\/p>\n<p><span style=\"font-weight: 400\">El motor de consulta de Analytics tambi\u00e9n eval\u00faa las funciones de ventana de forma distribuida y paralela a las particiones. El compilador de consultas crea un plan de ejecuci\u00f3n que contiene varios operadores que trabajan juntos para calcular el resultado de la llamada a la funci\u00f3n ventana. A continuaci\u00f3n, este plan de ejecuci\u00f3n se env\u00eda a todos los nodos de Analytics del cl\u00faster, donde cada operador trabaja en una partici\u00f3n de los datos de entrada. El motor de ejecuci\u00f3n coordina la ejecuci\u00f3n de los operadores y entrega el resultado de la consulta al cliente. Por ejemplo, considere la siguiente consulta que clasifica a los empleados de cada departamento por sus salarios.<\/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, salario\r\nFROM empleado<\/pre>\n<p><span style=\"font-weight: 400\">El procesador de consultas eval\u00faa esta funci\u00f3n en tres pasos, como se ilustra en la 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: Ejecuci\u00f3n distribuida y paralela de consultas de funciones ventana<\/strong><\/p>\n<ol>\n<li><span style=\"font-weight: 400\">Una vez seleccionados los datos del conjunto de datos de empleados, se reparticionan de acuerdo con la subcl\u00e1usula PARTITION BY de la cl\u00e1usula OVER. La disposici\u00f3n inicial de los datos puede tener cada uno de los registros de departamento dispersos en diferentes particiones de almacenamiento en varios nodos Analytics. Tras el paso de repartici\u00f3n, todos los registros de empleados de un mismo departamento llegan a la misma partici\u00f3n de c\u00e1lculo. El paso de repartici\u00f3n se ejecuta en paralelo en todos los nodos\/particiones del cl\u00faster. En la configuraci\u00f3n m\u00e1s com\u00fan de Analytics existe una relaci\u00f3n de uno a uno entre el n\u00famero de particiones de datos y el n\u00famero de n\u00facleos de CPU disponibles en el cl\u00faster.<\/span><\/li>\n<li><span style=\"font-weight: 400\">Los registros de cada departamento se ordenan seg\u00fan la subcl\u00e1usula ORDER BY de la cl\u00e1usula OVER. Una vez que los registros de cada departamento han llegado a sus particiones de c\u00e1lculo correspondientes, el procesador de consultas comienza a ordenar los datos. Este paso de ordenaci\u00f3n tambi\u00e9n se realiza en paralelo en todos los nodos Analytics.<\/span><\/li>\n<li><span style=\"font-weight: 400\">La funci\u00f3n RANK() se calcula a partir de los registros ordenados de cada departamento. Esta funci\u00f3n en particular solo necesita mirar el registro actual y compararlo con el anterior, por lo que puede evaluarse de forma continua sin necesidad de materializar datos adicionales.<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400\">La ejecuci\u00f3n de estos pasos en paralelo en todos los nodos disponibles permite a Analytics utilizar todos los recursos inform\u00e1ticos del cl\u00faster. Esto permite a Analytics lograr una escalabilidad lineal a medida que se a\u00f1aden m\u00e1s nodos para alcanzar los objetivos de rendimiento requeridos.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Veamos c\u00f3mo se pueden identificar las etapas anteriores dentro de un plan de ejecuci\u00f3n de consulta. La funci\u00f3n Analytics explain plan se describi\u00f3 en un <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/analytics-explain-plan-part-1\/\"><span style=\"font-weight: 400\">entrada anterior<\/span><\/a><span style=\"font-weight: 400\"> [<a href=\"#ref9\">9<\/a>], por lo que aqu\u00ed s\u00f3lo nos centraremos en el fragmento del plan relacionado con la evaluaci\u00f3n de la funci\u00f3n ventana. (Recordemos que los planes de consulta de Analytics deben leerse de abajo arriba).<\/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 del plan de ejecuci\u00f3n de la consulta<\/strong><\/p>\n<p><span style=\"font-weight: 400\">El operador \"data-scan\" lee los datos del conjunto de datos de los empleados y los pasa al operador \"exchange\", que se encarga de repartirlos. El campo de repartici\u00f3n es \"department_id\", tal y como se solicita en la subcl\u00e1usula PARTITION BY. A continuaci\u00f3n, el operador \"order\" ordena los datos seg\u00fan la subcl\u00e1usula ORDER BY. Por \u00faltimo, el operador \"window-aggregate\" calcula la funci\u00f3n RANK(). Obs\u00e9rvese que el valor \"physical-operator\" de este operador es \"WINDOW_STREAM\", lo que significa que el operador funciona en flujo y no requiere ninguna materializaci\u00f3n adicional de los datos. El campo \"execution-mode\" se establece en \"PARTITIONED\" para todos los operadores, por lo que se ejecutar\u00e1n en todas las particiones de c\u00e1lculo disponibles en el cl\u00faster.<\/span><\/p>\n<p><span style=\"font-weight: 400\">La evaluaci\u00f3n de algunas funciones de ventana puede requerir informaci\u00f3n relativa a toda una partici\u00f3n l\u00f3gica (su n\u00famero total de tuplas para las funciones NTILE() y PERCENTILE_RANK(), por ejemplo) o m\u00faltiples iteraciones sobre toda la partici\u00f3n (cuando se calculan marcos de ventana para funciones agregadas). Tales funciones son procesadas por operadores de ventana de no flujo. Un operador de ventana no secuencial se identifica por el valor \"physical-operator\" de \"WINDOW\" en el plan de ejecuci\u00f3n de la consulta. El operador materializa una partici\u00f3n l\u00f3gica cada vez e inicia el c\u00e1lculo de la funci\u00f3n ventana para cada tupla de esa partici\u00f3n. Para manejar cantidades arbitrarias de datos entrantes, el operador sigue el modelo de gesti\u00f3n de memoria del motor de ejecuci\u00f3n de Analytics. El planificador de consultas asigna un presupuesto de memoria a cada operador. Este presupuesto no puede superarse durante la ejecuci\u00f3n de la consulta. Los datos operativos que superan el presupuesto son volcados al disco por cada operador y le\u00eddos de nuevo m\u00e1s tarde, cuando la memoria vuelve a estar disponible. Una consulta suele constar de varios operadores y, por tanto, tiene un presupuesto de memoria global que no puede superarse en tiempo de ejecuci\u00f3n. El procesador de consultas Analytics implementa un control de carga basado en recursos para las consultas entrantes, admitiendo \u00fanicamente aquellas que pueden ejecutarse dentro de la memoria disponible en todos los nodos.<\/span><\/p>\n<p><span style=\"font-weight: 400\">N1QL for Analytics tambi\u00e9n impone menos restricciones al contexto sint\u00e1ctico de las llamadas a funciones ventana. A diferencia de SQL, las consultas en N1QL for Analytics permiten funciones de ventana en las cl\u00e1usulas WHERE y HAVING, as\u00ed como en las cl\u00e1usulas LET espec\u00edficas de N1QL.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Nuestra consulta original, por ejemplo, puede modificarse f\u00e1cilmente para devolver s\u00f3lo el empleado mejor clasificado en cada departamento:<\/span><\/p>\n<pre class=\"whitespace-before:1 whitespace-after:1 lang:plsql decode:true\">SELECT empleado_id, departamento_id, salario\r\nFROM empleado\r\nWHERE RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) = 1<\/pre>\n<p><span style=\"font-weight: 400\">Para concluir, las funciones de ventana en Analytics proporcionan un poderoso mecanismo para el an\u00e1lisis paralelo de datos y la generaci\u00f3n de informes. El lenguaje de consulta N1QL de Couchbase permite a los usuarios evaluar f\u00e1cilmente esas funciones directamente en los datos JSON de su aplicaci\u00f3n, evitando as\u00ed el complejo procesamiento ETL.<br \/>\n<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/?family=server&amp;product=couchbase-server-developer\"><span style=\"font-weight: 400\">Descargar Couchbase Server 6.5<\/span><\/a><span style=\"font-weight: 400\"> hoy mismo y p\u00f3ngase en contacto con nosotros en el <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/forums\/c\/analytics\/\"><span style=\"font-weight: 400\">Foros<\/span><\/a><span style=\"font-weight: 400\"> para cualquier pregunta o comentario.<\/span><\/p>\n<h4><span style=\"font-weight: 400\">Referencias<\/span><\/h4>\n<p><span style=\"font-weight: 400\"><a id=\"ref1\"><\/a>[1] Anuncio de Couchbase Server 6.5 GA - Novedades y mejoras<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/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] A la par con las funciones de ventana<\/span><br \/>\n<a href=\"https:\/\/www.couchbase.com\/blog\/es\/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] Obtenga una visi\u00f3n m\u00e1s amplia con las funciones de ventana y CTE de N1QL<\/span><br \/>\n<a href=\"https:\/\/www.couchbase.com\/blog\/es\/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] Funciones de ventana en Couchbase Analytics<\/span><br \/>\n<a href=\"https:\/\/www.couchbase.com\/blog\/es\/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] Anuncio de Couchbase Server 6.0 con Analytics<br \/>\n<\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/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] Historia de todo en Couchbase: DCP<br \/>\n<\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/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 y 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: Under the Hood - 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] Analytics Explain Plan - Parte 1<br \/>\n<\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/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 v26.2 (Yoast SEO v26.2) - 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\/es\/deep-dive-window-functions-in-couchbase-analytics\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\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\/es\/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\":\"es\",\"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\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\",\"@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\/es\/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\/es\/deep-dive-window-functions-in-couchbase-analytics\/","og_locale":"es_MX","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\/es\/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":"es","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":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/deep-dive-window-functions-in-couchbase-analytics\/"]}]},{"@type":"ImageObject","inLanguage":"es","@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":"El blog de Couchbase","description":"Couchbase, la base de datos 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":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@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, Ingeniero Principal, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@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\/es\/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 es un ingeniero principal que trabaja en Couchbase Analytics, centr\u00e1ndose en su compilador de consultas y el motor de ejecuci\u00f3n.\r\nCuenta con m\u00e1s de 15 a\u00f1os de experiencia en la creaci\u00f3n de software empresarial en Oracle, BEA Systems y empresas emergentes."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/7680","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/45683"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=7680"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/7680\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/7111"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=7680"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=7680"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=7680"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=7680"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}