Tanto si se trata de una necesidad personal de entender su patrón de gasto a partir de las transacciones bancarias, como si se trata de mejorar el rendimiento de las ventas en su organización mediante el análisis de las actividades de ventas, los conocimientos reales sólo son visibles con la agregación y el resumen adicionales de los datos a nivel transaccional. El RDBMS tradicional proporciona esta capacidad a través del poder expresivo de la agregación SQL. Las funciones de ventana se añadieron al estándar ANSI SQL para ampliar aún más la capacidad de expresar preguntas más complejas con el constructo SQL.
Couchbase N1QL ahora soporta las funciones de ventana y la expresión de tabla común (CTE) en su versión 6.5. Los desarrolladores pueden ampliar sus aplicaciones para satisfacer casos de uso empresarial más complejos, además de permitir a los analistas de datos obtener las respuestas que necesitan sin necesidad de realizar un posprocesamiento adicional en Excel.
En este artículo me centraré en un par de ejemplos sobre cómo puede aprovechar las funciones de ventana N1QL y CTE para abordar dos preguntas de negocio muy comunes.
Duración de las actividades de venta por cliente
En este primer ejemplo para un sistema de gestión de la actividad de ventas, queremos proporcionar un informe que muestre la cantidad de tiempo que el equipo de ventas ha pasado trabajando con sus clientes durante enero-2019. Desglosaré la consulta en dos pasos:
1) Obtener una lista de las reuniones y la duración de las mismas que el equipo de ventas ha realizado con sus clientes. El tiempo total empleado para todos los clientes 'tiempo_total_empleado' se calcula sumando la duración de las citas con una cláusula OVER () vacía, que realizará la suma para todo el conjunto de resultados. El tiempo total empleado por cliente 'tiempo_cuenta_empleado' utiliza la misma construcción, pero con 'accid' para la cláusula PARTITION.
|
1 2 3 4 5 6 7 8 |
SELECT c.name, a.startDate, a.title, a.duration, SUM(a.duration) OVER() as total_time_spent, SUM(a.duration) OVER(PARTITION BY a.accid) AS account_time_spent FROM crm a INNER JOIN crm c ON a.accid = c.id AND c.type='account' WHERE a.type='activity' AND a.activityType='Appointment' AND a.startDate BETWEEN '2018-01-01' and '2018-01-31' |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
account_time_spent duration name startDate title total_time_spent 30 "30" "Smith, Avila and Cisneros" "2018-01-24 15:00:00" "Switchable coherent adapter" 25770 510 "150" "Riddle Ltd" "2018-01-05 15:30:00" "Streamlined intermediate intranet" 25770 510 "90" "Riddle Ltd" "2018-01-28 14:30:00" "Advanced solution-oriented synergy" 25770 510 "90" "Riddle Ltd" "2018-01-01 15:00:00" "Ameliorated object-oriented methodology" 25770 510 "30" "Riddle Ltd" "2018-01-10 08:00:00" "Object-based multi-state firmware" 25770 510 "150" "Riddle Ltd" "2018-01-23 09:00:00" "Multi-layered systematic software" 25770 120 "30" "Foster Inc" "2018-01-29 09:30:00" "Public-key bottom-line database" 25770 120 "30" "Foster Inc" "2018-01-09 13:00:00" "Quality-focused local emulation" 25770 120 "60" "Foster Inc" "2018-01-02 08:00:00" "Digitized motivating matrix" 25770 120 "30" "Williams Ltd" "2018-01-22 08:30:00" "Versatile heuristic workforce" 25770 120 "30" "Williams Ltd" "2018-01-24 13:30:00" "Front-line 4thgeneration help-desk" 25770 120 "60" "Williams Ltd" "2018-01-14 14:30:00" "Visionary upward-trending success" 25770 330 "150" "Reid Ltd" "2018-01-21 10:30:00" "Profound logistical archive" 25770 330 "30" "Reid Ltd" "2018-01-13 13:30:00" "Down-sized coherent access" 25770 330 "120" "Reid Ltd" "2018-01-02 12:00:00" "Front-line object-oriented moderator" 25770 330 "30" "Reid Ltd" "2018-01-12 09:30:00" "Programmable reciprocal infrastructure" 25770 .... |
2) A continuación, utilice las dos métricas para obtener el porcentaje del tiempo total que el equipo dedicó a cada cliente.
|
1 2 3 4 5 6 7 8 9 10 |
SELECT c.name, ROUND(( SUM(SUM(a.duration)) OVER(PARTITION BY a.accid) / SUM(SUM(a.duration)) OVER()),2) as pct_time FROM crm a INNER JOIN crm c ON a.accid = c.id AND c.type='account' WHERE a.type='activity' AND a.activityType='Appointment' AND a.startDate BETWEEN '2018-01-01' and '2018-01-31' GROUP BY c.name, a.accid ORDER BY 2 DESC |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
name pct_time "Johnson, Adams and Kelly" 0.17 "Davis Group" 0.08 "Gilbert-Morris" 0.08 "Torres and Sons" 0.07 "Reid Ltd" 0.07 "Medina-Daniels" 0.07 "Riddle Ltd" 0.05 "Henderson and Sons" 0.05 "Gill and Sons" 0.05 "Garcia-Young" 0.05 "Sullivan PLC" 0.03 "Brown-Rogers" 0.03 "Foster Inc" 0.03 "Wheeler Inc" 0.03 "Jarvis-Small" 0.03 "Jones-Fox" 0.03 "Lloyd, Blair and Pruitt" 0.03 "Vaughn LLC" 0.02 |
Actividades de venta mes a mes
En este segundo ejemplo, la consulta muestra cómo ha cambiado el número de tareas relacionadas con las ventas mes a mes para el año 2018. La consulta aprovecha la función CTE de N1QL para mejorar la legibilidad de la consulta, y también la función de ventana LAG para obtener el recuento de tareas del periodo anterior.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
WITH current_period_task AS ( SELECT DATE_TRUNC_STR(a.startDate,'month') AS month, COUNT(1) AS current_period_task_count FROM crm a WHERE a.type='activity' AND a.activityType = 'Task' AND DATE_PART_STR(a.startDate,'year') = 2018 GROUP BY DATE_TRUNC_STR(a.startDate,'month') ), last_period_task AS ( SELECT x.month, x.current_period_task_count, LAG(x.current_period_task_count) OVER ( ORDER BY x.month) AS last_period_task_count FROM current_period_task x ) SELECT b.month, b.current_period_task_count, ROUND(((b.current_period_task_count - b.last_period_task_count ) / b.last_period_task_count),2) AS MoMChg FROM last_period_task AS b |
- El primer CTE - 'current_period_task' define la consulta para recuperar un recuento de todas las actividades de tipo Task agrupadas por el mes natural.
- El segundo CTE - 'last_period_task' lee del primer CTE, y también aprovecha la función de ventana LAG para devolver el recuento de tareas del mes anterior. Tenga en cuenta que la cláusula ORDER BY es fundamental para que la función LAG funcione.
- La consulta principal lee del segundo CTE - 'last_period_task' y deriva el cálculo mes a mes.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
MoMChg current_period_task_count month 283 "2018-01-01" -0.08 260 "2018-02-01" 0.1 287 "2018-03-01" -0.08 264 "2018-04-01" 0.11 292 "2018-05-01" 0 293 "2018-06-01" -0.03 285 "2018-07-01" 0 285 "2018-08-01" 0 284 "2018-09-01" 0 283 "2018-10-01" -0.05 268 "2018-11-01" 0.06 285 "2018-12-01" |
Recursos
- Descargar: Descargar Couchbase Server 6.5
- Documentación: Novedades de Couchbase Server 6.5
- Todos los blogs de 6.5
Nos encantaría que nos dijera qué le han parecido las funciones de la versión 6.5 y en qué beneficiarán a su empresa en el futuro. Por favor, comparta su opinión a través de los comentarios o en el foro.