From e8d4f06911713f84d1c2c8b8314b2684ed717c2f Mon Sep 17 00:00:00 2001 From: andmanfrin Date: Wed, 12 Nov 2025 16:36:17 +0100 Subject: [PATCH 1/2] PRD added visualization in ticketing analytics dashboard --- .../ticketing-analytics.yaml | 236 ++++++++++++++---- 1 file changed, 185 insertions(+), 51 deletions(-) diff --git a/ionos_prd/grafana-dashboards/ticketing-analytics.yaml b/ionos_prd/grafana-dashboards/ticketing-analytics.yaml index c63f8f95c..8273ac89a 100644 --- a/ionos_prd/grafana-dashboards/ticketing-analytics.yaml +++ b/ionos_prd/grafana-dashboards/ticketing-analytics.yaml @@ -96,7 +96,7 @@ data: "editorMode": "code", "format": "table", "rawQuery": true, - "rawSql": "SELECT\r\n g.name AS group_name,\r\n COUNT(CASE WHEN t.state_id NOT IN (4, 7) THEN 1 END) AS \"OPEN TICKETS\"\r\nFROM\r\n tickets t\r\nRIGHT JOIN\r\n groups g ON t.group_id = g.id\r\nWHERE\r\n g.id IN (27, 26, 18, 12, 11, 10, 7, 6, 5, 4, 3)\r\nGROUP BY\r\n g.name\r\nORDER BY\r\n g.name ASC;", + "rawSql": "SELECT\r\n g.name AS group_name,\r\n COUNT(CASE WHEN t.state_id NOT IN (4, 7) THEN 1 END) AS \"OPEN TICKETS\"\r\nFROM\r\n tickets t\r\nRIGHT JOIN\r\n groups g ON t.group_id = g.id\r\nWHERE\r\n g.id IN (3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 17, 18, 27, 29)\r\nGROUP BY\r\n g.name\r\nORDER BY\r\n g.name ASC;", "refId": "A", "sql": { "columns": [ @@ -169,8 +169,8 @@ data: "overrides": [] }, "gridPos": { - "h": 13, - "w": 14, + "h": 15, + "w": 22, "x": 0, "y": 13 }, @@ -206,7 +206,7 @@ data: "editorMode": "code", "format": "table", "rawQuery": true, - "rawSql": "SELECT\r\n g.name AS group_name,\r\n COUNT(CASE WHEN t.state_id NOT IN (4, 7) AND t.escalation_at IS NOT NULL AND t.escalation_at <= NOW() THEN 1 END) AS \"ESCALATED TICKETS\",\r\n MAX(CASE WHEN t.state_id NOT IN (4, 7) AND t.escalation_at IS NOT NULL AND t.escalation_at <= NOW() THEN EXTRACT(EPOCH FROM (NOW() - t.escalation_at)) / 86400 END) AS \"MAX ESCALATION TIME (DAYS)\"\r\nFROM\r\n tickets t\r\nRIGHT JOIN\r\n groups g ON t.group_id = g.id\r\nWHERE\r\n g.id IN (27, 26, 18, 12, 11, 10, 7, 6, 5, 4, 3)\r\nGROUP BY\r\n g.name\r\nHAVING\r\n COUNT(CASE WHEN t.state_id NOT IN (4, 7) AND t.escalation_at IS NOT NULL AND t.escalation_at <= NOW() THEN 1 END) > 0\r\nORDER BY\r\n g.name ASC;", + "rawSql": "SELECT\r\n g.name AS group_name,\r\n COUNT(CASE WHEN t.state_id NOT IN (4, 7) AND t.escalation_at IS NOT NULL AND t.escalation_at <= NOW() THEN 1 END) AS \"ESCALATED TICKETS\",\r\n ROUND(MAX(CASE WHEN t.state_id NOT IN (4, 7) AND t.escalation_at IS NOT NULL AND t.escalation_at <= NOW() THEN EXTRACT(EPOCH FROM (NOW() - t.escalation_at)) / 86400 END)) AS \"MAX ESCALATION TIME (DAYS)\"\r\nFROM\r\n tickets t\r\nRIGHT JOIN\r\n groups g ON t.group_id = g.id\r\nWHERE\r\n g.id IN (3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 17, 18, 27, 29)\r\nGROUP BY\r\n g.name\r\nHAVING\r\n COUNT(CASE WHEN t.state_id NOT IN (4, 7) AND t.escalation_at IS NOT NULL AND t.escalation_at <= NOW() THEN 1 END) > 0\r\nORDER BY\r\n g.name ASC;", "refId": "A", "sql": { "columns": [ @@ -264,10 +264,10 @@ data: "overrides": [] }, "gridPos": { - "h": 9, - "w": 12, + "h": 10, + "w": 10, "x": 0, - "y": 26 + "y": 28 }, "id": 7, "options": { @@ -298,7 +298,7 @@ data: "editorMode": "code", "format": "table", "rawQuery": true, - "rawSql": "SELECT\r\n g.name AS group_name,\r\n AVG(EXTRACT(EPOCH FROM NOW() - t.created_at) / 86400) AS \"AVERAGE TICKET AGE (DAYS)\"\r\nFROM\r\n groups g\r\nLEFT JOIN\r\n tickets t ON t.group_id = g.id\r\n AND t.state_id NOT IN (3, 4, 7) -- Considera solo i ticket aperti\r\nWHERE\r\n g.id IN (27, 26, 18, 12, 11, 10, 7, 6, 5, 4, 3)\r\n AND t.id IS NOT NULL -- Assicura che solo gruppi con ticket aperti siano inclusi\r\nGROUP BY\r\n g.name\r\nORDER BY\r\n g.name ASC;", + "rawSql": "SELECT\r\n g.name AS group_name,\r\n ROUND(AVG(EXTRACT(EPOCH FROM NOW() - t.created_at) / 86400)) AS \"AVERAGE TICKET AGE (DAYS)\"\r\nFROM\r\n groups g\r\nLEFT JOIN\r\n tickets t ON t.group_id = g.id\r\n AND t.state_id NOT IN (3, 4, 7) \r\nWHERE\r\n g.id IN (3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 17, 18, 27, 29)\r\n AND t.id IS NOT NULL \r\nGROUP BY\r\n g.name\r\nHAVING\r\n ROUND(AVG(EXTRACT(EPOCH FROM NOW() - t.created_at) / 86400)) > 0 \r\nORDER BY\r\n g.name ASC;", "refId": "A", "sql": { "columns": [ @@ -385,7 +385,7 @@ data: "h": 16, "w": 19, "x": 0, - "y": 35 + "y": 38 }, "id": 11, "options": { @@ -522,7 +522,7 @@ data: "h": 16, "w": 19, "x": 0, - "y": 51 + "y": 54 }, "id": 12, "options": { @@ -588,28 +588,17 @@ data: "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, + "fillOpacity": 80, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 3, - "pointSize": 6, + "lineWidth": 1, "scaleDistribution": { "type": "linear" }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, "thresholdsStyle": { "mode": "off" } @@ -632,24 +621,33 @@ data: "overrides": [] }, "gridPos": { - "h": 19, - "w": 19, + "h": 17, + "w": 16, "x": 0, - "y": 67 + "y": 70 }, "id": 8, "options": { + "barRadius": 0, + "barWidth": 0.97, + "fullHighlight": false, + "groupWidth": 0.7, "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, + "orientation": "auto", + "showValue": "auto", + "stacking": "none", "tooltip": { "maxHeight": 600, "mode": "single", "sort": "none" - } + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 0 }, "targets": [ { @@ -660,7 +658,7 @@ data: "editorMode": "code", "format": "table", "rawQuery": true, - "rawSql": "WITH intervals AS (\r\n SELECT \r\n generate_series(\r\n DATE_TRUNC('week', NOW()), \r\n DATE_TRUNC('week', NOW()) - INTERVAL '180 days', \r\n '-7 days'\r\n ) AS week_start\r\n)\r\nSELECT \r\n intervals.week_start,\r\n COUNT(*) FILTER (WHERE group_id = 18) AS \"01 - Marketing Activities\",\r\n COUNT(*) FILTER (WHERE group_id = 27) AS \"02 - Project Website\",\r\n COUNT(*) FILTER (WHERE group_id = 11) AS \"03 - Privacy & Legal\",\r\n COUNT(*) FILTER (WHERE group_id = 4) AS \"04 - Credential Management\",\r\n COUNT(*) FILTER (WHERE group_id = 5) AS \"05 - Dome Marketplace\",\r\n COUNT(*) FILTER (WHERE group_id = 29) AS \"06 - Chatbot\",\r\n COUNT(*) FILTER (WHERE group_id = 17) AS \"07 - Dome Search\",\r\n COUNT(*) FILTER (WHERE group_id = 8) AS \"08 - Billing & Invoicing\",\r\n COUNT(*) FILTER (WHERE group_id = 9) AS \"09 - Payment System\",\r\n COUNT(*) FILTER (WHERE group_id = 3) AS \"10 - Offering Qualification Process\",\r\n COUNT(*) FILTER (WHERE group_id = 7) AS \"11 - Integration and Replica\",\r\n COUNT(*) FILTER (WHERE group_id = 12) AS \"12 - Infrastructure\",\r\n COUNT(*) FILTER (WHERE group_id = 6) AS \"13 - DevOps Deployments\", \r\n COUNT(*) FILTER (WHERE group_id = 10) AS \"14 - Customer Care\"\r\nFROM \r\n intervals\r\nLEFT JOIN \r\n tickets \r\nON \r\n tickets.created_at >= intervals.week_start\r\n AND tickets.created_at < intervals.week_start + INTERVAL '7 days'\r\nGROUP BY \r\n intervals.week_start\r\nORDER BY \r\n intervals.week_start ASC;", + "rawSql": "WITH intervals AS (\r\n SELECT \r\n generate_series(\r\n DATE_TRUNC('week', NOW()), \r\n DATE_TRUNC('week', NOW()) - INTERVAL '25 days', \r\n '-7 days'\r\n ) AS week_start\r\n)\r\nSELECT \r\n intervals.week_start,\r\n COUNT(*) FILTER (WHERE group_id = 18) AS \"01 - Marketing Activities\",\r\n COUNT(*) FILTER (WHERE group_id = 27) AS \"02 - Project Website\",\r\n COUNT(*) FILTER (WHERE group_id = 11) AS \"03 - Privacy & Legal\",\r\n COUNT(*) FILTER (WHERE group_id = 4) AS \"04 - Credential Management\",\r\n COUNT(*) FILTER (WHERE group_id = 5) AS \"05 - Dome Marketplace\",\r\n COUNT(*) FILTER (WHERE group_id = 29) AS \"06 - Chatbot\",\r\n COUNT(*) FILTER (WHERE group_id = 17) AS \"07 - Dome Search\",\r\n COUNT(*) FILTER (WHERE group_id = 8) AS \"08 - Billing & Invoicing\",\r\n COUNT(*) FILTER (WHERE group_id = 9) AS \"09 - Payment System\",\r\n COUNT(*) FILTER (WHERE group_id = 3) AS \"10 - Offering Qualification Process\",\r\n COUNT(*) FILTER (WHERE group_id = 7) AS \"11 - Integration and Replica\",\r\n COUNT(*) FILTER (WHERE group_id = 12) AS \"12 - Infrastructure\",\r\n COUNT(*) FILTER (WHERE group_id = 6) AS \"13 - DevOps Deployments\", \r\n COUNT(*) FILTER (WHERE group_id = 10) AS \"14 - Customer Care\"\r\nFROM \r\n intervals\r\nLEFT JOIN \r\n tickets \r\nON \r\n tickets.created_at >= intervals.week_start\r\n AND tickets.created_at < intervals.week_start + INTERVAL '7 days'\r\nGROUP BY \r\n intervals.week_start\r\nORDER BY \r\n intervals.week_start ASC;", "refId": "A", "sql": { "columns": [ @@ -682,7 +680,7 @@ data: } ], "title": "OPENED TICKETS TREND", - "type": "timeseries" + "type": "barchart" }, { "datasource": { @@ -700,28 +698,17 @@ data: "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, + "fillOpacity": 80, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 3, - "pointSize": 6, + "lineWidth": 1, "scaleDistribution": { "type": "linear" }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, "thresholdsStyle": { "mode": "off" } @@ -731,7 +718,8 @@ data: "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -743,24 +731,33 @@ data: "overrides": [] }, "gridPos": { - "h": 17, - "w": 19, + "h": 12, + "w": 16, "x": 0, - "y": 86 + "y": 87 }, "id": 9, "options": { + "barRadius": 0, + "barWidth": 0.97, + "fullHighlight": false, + "groupWidth": 0.7, "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, + "orientation": "auto", + "showValue": "auto", + "stacking": "none", "tooltip": { "maxHeight": 600, "mode": "single", "sort": "none" - } + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 0 }, "targets": [ { @@ -771,7 +768,7 @@ data: "editorMode": "code", "format": "table", "rawQuery": true, - "rawSql": "WITH intervals AS (\r\n SELECT \r\n generate_series(\r\n DATE_TRUNC('week', NOW()), \r\n DATE_TRUNC('week', NOW()) - INTERVAL '180 days', \r\n '-7 days'\r\n ) AS week_start\r\n)\r\nSELECT \r\n intervals.week_start,\r\n COUNT(*) FILTER (WHERE group_id = 18) AS \"01 - Marketing Activities\",\r\n COUNT(*) FILTER (WHERE group_id = 27) AS \"02 - Project Website\",\r\n COUNT(*) FILTER (WHERE group_id = 11) AS \"03 - Privacy & Legal\",\r\n COUNT(*) FILTER (WHERE group_id = 4) AS \"04 - Credential Management\",\r\n COUNT(*) FILTER (WHERE group_id = 5) AS \"05 - Dome Marketplace\",\r\n COUNT(*) FILTER (WHERE group_id = 29) AS \"06 - Chatbot\",\r\n COUNT(*) FILTER (WHERE group_id = 17) AS \"07 - Dome Search\",\r\n COUNT(*) FILTER (WHERE group_id = 8) AS \"08 - Billing & Invoicing\",\r\n COUNT(*) FILTER (WHERE group_id = 9) AS \"09 - Payment System\",\r\n COUNT(*) FILTER (WHERE group_id = 3) AS \"10 - Offering Qualification Process\",\r\n COUNT(*) FILTER (WHERE group_id = 7) AS \"11 - Integration and Replica\",\r\n COUNT(*) FILTER (WHERE group_id = 12) AS \"12 - Infrastructure\",\r\n COUNT(*) FILTER (WHERE group_id = 6) AS \"13 - DevOps Deployments\", \r\n COUNT(*) FILTER (WHERE group_id = 10) AS \"14 - Customer Care\"\r\nFROM \r\n intervals\r\nLEFT JOIN \r\n tickets \r\nON \r\n tickets.last_close_at >= intervals.week_start\r\n AND tickets.last_close_at < intervals.week_start + INTERVAL '7 days'\r\nGROUP BY \r\n intervals.week_start\r\nORDER BY \r\n intervals.week_start ASC;", + "rawSql": "WITH intervals AS (\r\n SELECT \r\n generate_series(\r\n DATE_TRUNC('week', NOW()), \r\n DATE_TRUNC('week', NOW()) - INTERVAL '25 days', \r\n '-7 days'\r\n ) AS week_start\r\n)\r\nSELECT \r\n intervals.week_start,\r\n COUNT(*) FILTER (WHERE group_id = 18) AS \"01 - Marketing Activities\",\r\n COUNT(*) FILTER (WHERE group_id = 27) AS \"02 - Project Website\",\r\n COUNT(*) FILTER (WHERE group_id = 11) AS \"03 - Privacy & Legal\",\r\n COUNT(*) FILTER (WHERE group_id = 4) AS \"04 - Credential Management\",\r\n COUNT(*) FILTER (WHERE group_id = 5) AS \"05 - Dome Marketplace\",\r\n COUNT(*) FILTER (WHERE group_id = 29) AS \"06 - Chatbot\",\r\n COUNT(*) FILTER (WHERE group_id = 17) AS \"07 - Dome Search\",\r\n COUNT(*) FILTER (WHERE group_id = 8) AS \"08 - Billing & Invoicing\",\r\n COUNT(*) FILTER (WHERE group_id = 9) AS \"09 - Payment System\",\r\n COUNT(*) FILTER (WHERE group_id = 3) AS \"10 - Offering Qualification Process\",\r\n COUNT(*) FILTER (WHERE group_id = 7) AS \"11 - Integration and Replica\",\r\n COUNT(*) FILTER (WHERE group_id = 12) AS \"12 - Infrastructure\",\r\n COUNT(*) FILTER (WHERE group_id = 6) AS \"13 - DevOps Deployments\", \r\n COUNT(*) FILTER (WHERE group_id = 10) AS \"14 - Customer Care\"\r\nFROM \r\n intervals\r\nLEFT JOIN \r\n tickets \r\nON \r\n tickets.last_close_at >= intervals.week_start\r\n AND tickets.last_close_at < intervals.week_start + INTERVAL '7 days'\r\nGROUP BY \r\n intervals.week_start\r\nORDER BY \r\n intervals.week_start ASC;", "refId": "A", "sql": { "columns": [ @@ -793,7 +790,144 @@ data: } ], "title": "CLOSED TICKETS TREND", - "type": "timeseries" + "type": "barchart" + }, + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "P68D0D9E587DEE267" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "interventions 14-21 days ago" + }, + "properties": [ + { + "id": "custom.width", + "value": 218 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "interventions 7-14 days ago" + }, + "properties": [ + { + "id": "custom.width", + "value": 224 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "interventions last 7 days" + }, + "properties": [ + { + "id": "custom.width", + "value": 209 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "INTERVENTIONS LAST 7 DAYS" + }, + "properties": [ + { + "id": "custom.width", + "value": 237 + } + ] + } + ] + }, + "gridPos": { + "h": 25, + "w": 17, + "x": 0, + "y": 99 + }, + "id": 13, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "11.0.0", + "targets": [ + { + "datasource": { + "type": "grafana-postgresql-datasource", + "uid": "P68D0D9E587DEE267" + }, + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\r\n o.name,\r\n COUNT(DISTINCT CASE \r\n WHEN ta.created_at >= NOW() - INTERVAL '7 days' THEN t.number\r\n END) AS \"INTERVENTIONS LAST 7 DAYS\",\r\n COUNT(DISTINCT CASE \r\n WHEN ta.created_at < NOW() - INTERVAL '7 days'\r\n AND ta.created_at >= NOW() - INTERVAL '14 days' THEN t.number\r\n END) AS \"interventions 7-14 days ago\",\r\n COUNT(DISTINCT CASE \r\n WHEN ta.created_at < NOW() - INTERVAL '14 days'\r\n AND ta.created_at >= NOW() - INTERVAL '21 days' THEN t.number\r\n END) AS \"interventions 14-21 days ago\",\r\n COUNT(DISTINCT CASE \r\n WHEN ta.created_at < NOW() - INTERVAL '21 days'\r\n AND ta.created_at >= NOW() - INTERVAL '28 days' THEN t.number\r\n END) AS \"interventions 21-28 days ago\"\r\nFROM ticket_articles ta\r\nJOIN tickets t ON ta.ticket_id = t.id\r\nJOIN users u ON ta.created_by_id = u.id\r\nJOIN organizations o ON u.organization_id = o.id\r\nWHERE ta.created_by_id NOT IN (1)\r\n AND ta.created_by_id <> t.customer_id\r\nGROUP BY o.name\r\nORDER BY o.name ASC;", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + } + } + ], + "title": "Panel Title", + "type": "table" } ], "schemaVersion": 39, @@ -802,8 +936,8 @@ data: "list": [] }, "time": { - "from": "now-90d", - "to": "now" + "from": "now-1w/w", + "to": "now-1w/w" }, "timeRangeUpdatedDuringEditOrView": false, "timepicker": {}, From f3fbefa9ba3fd3a7b3993862d6ebff9bf5bb32e9 Mon Sep 17 00:00:00 2001 From: andmanfrin Date: Thu, 13 Nov 2025 10:55:36 +0100 Subject: [PATCH 2/2] PRD columns label order changed --- .../ticketing-analytics.yaml | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/ionos_prd/grafana-dashboards/ticketing-analytics.yaml b/ionos_prd/grafana-dashboards/ticketing-analytics.yaml index 8273ac89a..695686a44 100644 --- a/ionos_prd/grafana-dashboards/ticketing-analytics.yaml +++ b/ionos_prd/grafana-dashboards/ticketing-analytics.yaml @@ -872,12 +872,48 @@ data: "value": 237 } ] + }, + { + "matcher": { + "id": "byName", + "options": "INTERVENTIONS 28-21 DAYS AGO" + }, + "properties": [ + { + "id": "custom.width", + "value": 227 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "INTERVENTIONS 21-14 DAYS AGO" + }, + "properties": [ + { + "id": "custom.width", + "value": 261 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "INTERVENTIONS 14-7 DAYS AGO" + }, + "properties": [ + { + "id": "custom.width", + "value": 256 + } + ] } ] }, "gridPos": { "h": 25, - "w": 17, + "w": 18, "x": 0, "y": 99 }, @@ -905,7 +941,7 @@ data: "editorMode": "code", "format": "table", "rawQuery": true, - "rawSql": "SELECT\r\n o.name,\r\n COUNT(DISTINCT CASE \r\n WHEN ta.created_at >= NOW() - INTERVAL '7 days' THEN t.number\r\n END) AS \"INTERVENTIONS LAST 7 DAYS\",\r\n COUNT(DISTINCT CASE \r\n WHEN ta.created_at < NOW() - INTERVAL '7 days'\r\n AND ta.created_at >= NOW() - INTERVAL '14 days' THEN t.number\r\n END) AS \"interventions 7-14 days ago\",\r\n COUNT(DISTINCT CASE \r\n WHEN ta.created_at < NOW() - INTERVAL '14 days'\r\n AND ta.created_at >= NOW() - INTERVAL '21 days' THEN t.number\r\n END) AS \"interventions 14-21 days ago\",\r\n COUNT(DISTINCT CASE \r\n WHEN ta.created_at < NOW() - INTERVAL '21 days'\r\n AND ta.created_at >= NOW() - INTERVAL '28 days' THEN t.number\r\n END) AS \"interventions 21-28 days ago\"\r\nFROM ticket_articles ta\r\nJOIN tickets t ON ta.ticket_id = t.id\r\nJOIN users u ON ta.created_by_id = u.id\r\nJOIN organizations o ON u.organization_id = o.id\r\nWHERE ta.created_by_id NOT IN (1)\r\n AND ta.created_by_id <> t.customer_id\r\nGROUP BY o.name\r\nORDER BY o.name ASC;", + "rawSql": "SELECT\r\n o.name,\r\n COUNT(DISTINCT CASE \r\n WHEN ta.created_at < NOW() - INTERVAL '21 days'\r\n AND ta.created_at >= NOW() - INTERVAL '28 days' THEN t.number\r\n END) AS \"INTERVENTIONS 28-21 DAYS AGO\",\r\n COUNT(DISTINCT CASE \r\n WHEN ta.created_at < NOW() - INTERVAL '14 days'\r\n AND ta.created_at >= NOW() - INTERVAL '21 days' THEN t.number\r\n END) AS \"INTERVENTIONS 21-14 DAYS AGO\",\r\n COUNT(DISTINCT CASE \r\n WHEN ta.created_at < NOW() - INTERVAL '7 days'\r\n AND ta.created_at >= NOW() - INTERVAL '14 days' THEN t.number\r\n END) AS \"INTERVENTIONS 14-7 DAYS AGO\",\r\n COUNT(DISTINCT CASE \r\n WHEN ta.created_at >= NOW() - INTERVAL '7 days' THEN t.number\r\n END) AS \"INTERVENTIONS LAST 7 DAYS\" \r\n \r\nFROM ticket_articles ta\r\nJOIN tickets t ON ta.ticket_id = t.id\r\nJOIN users u ON ta.created_by_id = u.id\r\nJOIN organizations o ON u.organization_id = o.id\r\nWHERE ta.created_by_id NOT IN (1)\r\n AND ta.created_by_id <> t.customer_id\r\nGROUP BY o.name\r\nORDER BY o.name ASC;", "refId": "A", "sql": { "columns": [