Skip to content
Merged

Dev #675

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 43 additions & 21 deletions DSL/Resql/analytics/POST/feedback-buerokratt-chats-nps.sql
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ chat_buerokratt AS (
ORDER BY updated
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS ended,
CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config)
CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config)
THEN last_value(feedback_rating_five) OVER (
PARTITION BY base_id
ORDER BY updated
Expand All @@ -30,7 +30,7 @@ chat_buerokratt AS (
WHERE (
array_length(ARRAY[:urls]::TEXT[], 1) IS NULL
OR chat.end_user_url LIKE ANY(ARRAY[:urls]::TEXT[])
)
)
AND (
:showTest = TRUE
OR chat.test = FALSE
Expand All @@ -42,37 +42,59 @@ chat_buerokratt AS (
AND message.author_role = 'buerokratt'
)
AND status = 'ENDED'
AND CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config)
AND CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config)
THEN feedback_rating_five IS NOT NULL
ELSE feedback_rating IS NOT NULL
END
AND ended::timestamptz BETWEEN :start::timestamptz AND :end::timestamptz
),
point_nps AS (
SELECT date_trunc(:metric, ended)::text AS date_time,
COALESCE(
CAST((
(
SUM(CASE WHEN feedback_rating_dynamic BETWEEN 9 AND 10 THEN 1 ELSE 0 END) * 1.0 -
SUM(CASE WHEN feedback_rating_dynamic BETWEEN 0 AND 6 THEN 1 ELSE 0 END)
) / NULLIF(COUNT(feedback_rating_dynamic), 0) * 100
) AS int), 0) AS nps
CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config) THEN
ROUND(
100.0 * SUM(CASE WHEN feedback_rating_dynamic IN (4, 5) THEN 1 ELSE 0 END)
/ NULLIF(COUNT(feedback_rating_dynamic), 0),
2
)
ELSE
COALESCE(ROUND(
(
(SUM(CASE WHEN feedback_rating_dynamic BETWEEN 9 AND 10 THEN 1 ELSE 0 END) * 1.0 / NULLIF(COUNT(feedback_rating_dynamic), 0))
- (SUM(CASE WHEN feedback_rating_dynamic BETWEEN 0 AND 6 THEN 1 ELSE 0 END) * 1.0 / NULLIF(COUNT(feedback_rating_dynamic), 0))
) * 100,
2
), 0)
END AS nps
FROM chat_buerokratt
GROUP BY date_time
ORDER BY date_time
),
period_nps AS (
SELECT COALESCE(
CAST((
(
SUM(CASE WHEN feedback_rating_dynamic BETWEEN 9 AND 10 THEN 1 ELSE 0 END) * 1.0 -
SUM(CASE WHEN feedback_rating_dynamic BETWEEN 0 AND 6 THEN 1 ELSE 0 END)
) / NULLIF(COUNT(feedback_rating_dynamic), 0) * 100
) AS int), 0) AS nps
SELECT CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config) THEN
ROUND(
100.0 * SUM(CASE WHEN feedback_rating_dynamic IN (4, 5) THEN 1 ELSE 0 END)
/ NULLIF(COUNT(feedback_rating_dynamic), 0),
2
)
ELSE
COALESCE(ROUND(
(
(SUM(CASE WHEN feedback_rating_dynamic BETWEEN 9 AND 10 THEN 1 ELSE 0 END) * 1.0 / NULLIF(COUNT(feedback_rating_dynamic), 0))
- (SUM(CASE WHEN feedback_rating_dynamic BETWEEN 0 AND 6 THEN 1 ELSE 0 END) * 1.0 / NULLIF(COUNT(feedback_rating_dynamic), 0))
) * 100,
2
), 0)
END AS nps
FROM chat_buerokratt
),
is_five AS (
SELECT COALESCE(is_five_rating_scale, 'false') = 'true' AS is_five_scale FROM rating_config
)
SELECT json_build_object(
'pointNps', (SELECT json_agg(json_build_object('dateTime', date_time, 'nps', nps)) FROM point_nps),
'periodNps', (SELECT nps FROM period_nps)
) AS result
'periodNps', (SELECT nps FROM period_nps),
'isFiveScale', (SELECT is_five_scale FROM is_five)
) AS result
97 changes: 75 additions & 22 deletions DSL/Resql/analytics/POST/feedback-chats-distribution.sql
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ WITH rating_config AS (
AND NOT deleted
),
chats_filtered AS (
SELECT DISTINCT
SELECT DISTINCT
base_id,
first_value(created) OVER (
PARTITION BY base_id
ORDER BY updated
) AS created,
CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config)
CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config)
THEN last_value(feedback_rating_five) OVER (
PARTITION BY base_id
ORDER BY updated
Expand All @@ -28,44 +28,97 @@ chats_filtered AS (
WHERE (
array_length(ARRAY[:urls]::TEXT[], 1) IS NULL
OR chat.end_user_url LIKE ANY(ARRAY[:urls]::TEXT[])
)
)
AND (
:showTest = TRUE
OR chat.test = FALSE
)
)
AND STATUS = 'ENDED'
AND CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config)
AND CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config)
THEN feedback_rating_five IS NOT NULL
ELSE feedback_rating IS NOT NULL
END
AND created::timestamptz BETWEEN :start::timestamptz AND :end::timestamptz
AND (
(:chat_type = 'buerokratt' AND EXISTS (
SELECT 1
FROM message
WHERE message.chat_base_id = chat.base_id
SELECT 1
FROM message
WHERE message.chat_base_id = chat.base_id
AND message.author_role = 'buerokratt'
))
OR
OR
(:chat_type = 'csa' AND customer_support_id <> ''
AND EXISTS (
SELECT 1
FROM message
WHERE message.chat_base_id = chat.base_id
SELECT 1
FROM message
WHERE message.chat_base_id = chat.base_id
AND message.author_role = 'backoffice-user'
)
AND EXISTS (
SELECT 1
FROM message
WHERE message.chat_base_id = chat.base_id
SELECT 1
FROM message
WHERE message.chat_base_id = chat.base_id
AND message.author_role = 'end-user'
)
)
)
),
all_ended_chats AS (
SELECT COUNT(DISTINCT base_id) AS total_chats
FROM chat
WHERE (
array_length(ARRAY[:urls]::TEXT[], 1) IS NULL
OR chat.end_user_url LIKE ANY(ARRAY[:urls]::TEXT[])
)
AND (:showTest = TRUE OR chat.test = FALSE)
AND STATUS = 'ENDED'
AND created::timestamptz BETWEEN :start::timestamptz AND :end::timestamptz
AND (
(:chat_type = 'buerokratt' AND EXISTS (
SELECT 1 FROM message WHERE message.chat_base_id = chat.base_id AND message.author_role = 'buerokratt'
))
OR
(:chat_type = 'csa' AND customer_support_id <> ''
AND EXISTS (
SELECT 1 FROM message WHERE message.chat_base_id = chat.base_id AND message.author_role = 'backoffice-user'
)
AND EXISTS (
SELECT 1 FROM message WHERE message.chat_base_id = chat.base_id AND message.author_role = 'end-user'
)
)
)
),
rating_counts AS (
SELECT feedback_rating_dynamic AS rating, COUNT(*) AS cnt
FROM chats_filtered
GROUP BY feedback_rating_dynamic
),
scale_ratings AS (
SELECT generate_series AS rating
FROM (
SELECT generate_series(
CASE WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config) THEN 1 ELSE 0 END,
CASE WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config) THEN 5 ELSE 10 END
)
) s
),
no_feedback_count AS (
SELECT (SELECT total_chats FROM all_ended_chats) - (SELECT COUNT(*) FROM chats_filtered) AS cnt
),
distribution_with_no_feedback AS (
SELECT json_agg(elem ORDER BY ord, rating_nullable NULLS LAST) AS distribution
FROM (
SELECT 0 AS ord, sr.rating AS rating_nullable, json_build_object('rating', sr.rating, 'count', COALESCE(rc.cnt, 0)) AS elem
FROM scale_ratings sr
LEFT JOIN rating_counts rc ON sr.rating = rc.rating
UNION ALL
SELECT 1 AS ord, NULL::int AS rating_nullable, json_build_object('rating', '-', 'count', (SELECT cnt FROM no_feedback_count)) AS elem
) parts
)
SELECT
COUNT(CASE WHEN feedback_rating_dynamic BETWEEN 9 AND 10 THEN 1 END) AS promoters,
COUNT(CASE WHEN feedback_rating_dynamic BETWEEN 7 AND 8 THEN 1 END) AS passives,
COUNT(CASE WHEN feedback_rating_dynamic BETWEEN 0 AND 6 THEN 1 END) AS detractors
FROM chats_filtered;
SELECT json_build_object(
'distribution', (SELECT distribution FROM distribution_with_no_feedback),
'total_feedback', (SELECT COUNT(*) FROM chats_filtered),
'total_chats', (SELECT total_chats FROM all_ended_chats),
'is_five_scale', (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config)
) AS result;
68 changes: 48 additions & 20 deletions DSL/Resql/analytics/POST/feedback-csa-chats-feedback-nps.sql
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,18 @@ WITH rating_config AS (
),
chat_csas AS (
SELECT DISTINCT base_id,
first_value(created) over (
PARTITION by base_id
first_value(created) OVER (
PARTITION BY base_id
ORDER BY updated
) AS created,
CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config)
THEN last_value(feedback_rating_five) over (
PARTITION by base_id
CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config)
THEN last_value(feedback_rating_five) OVER (
PARTITION BY base_id
ORDER BY updated
)
ELSE last_value(feedback_rating) over (
PARTITION by base_id
ELSE last_value(feedback_rating) OVER (
PARTITION BY base_id
ORDER BY updated
)
END AS feedback_rating_dynamic
Expand All @@ -40,31 +40,59 @@ chat_csas AS (
AND message.author_role = 'end-user'
)
AND STATUS = 'ENDED'
AND CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config)
AND CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config)
THEN feedback_rating_five IS NOT NULL
ELSE feedback_rating IS NOT NULL
END
AND created::timestamptz BETWEEN :start::timestamptz AND :end::timestamptz
),
point_nps AS (
SELECT date_trunc(:metric, created)::text AS date_time,
coalesce(CAST(((
SUM(CASE WHEN feedback_rating_dynamic BETWEEN 9 AND 10 THEN 1 ELSE 0 END) * 1.0 -
SUM(CASE WHEN feedback_rating_dynamic BETWEEN 0 AND 6 THEN 1 ELSE 0 END)
) / COUNT(base_id) * 100) AS int), 0) AS nps
CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config) THEN
ROUND(
100.0 * SUM(CASE WHEN feedback_rating_dynamic IN (4, 5) THEN 1 ELSE 0 END)
/ NULLIF(COUNT(base_id), 0),
2
)
ELSE
COALESCE(ROUND(
(
(SUM(CASE WHEN feedback_rating_dynamic BETWEEN 9 AND 10 THEN 1 ELSE 0 END) * 1.0 / NULLIF(COUNT(base_id), 0))
- (SUM(CASE WHEN feedback_rating_dynamic BETWEEN 0 AND 6 THEN 1 ELSE 0 END) * 1.0 / NULLIF(COUNT(base_id), 0))
) * 100,
2
), 0)
END AS nps
FROM chat_csas
GROUP BY date_time
ORDER BY date_time
),
period_nps AS (
SELECT coalesce(CAST(((
SUM(CASE WHEN feedback_rating_dynamic BETWEEN 9 AND 10 THEN 1 ELSE 0 END) * 1.0 -
SUM(CASE WHEN feedback_rating_dynamic BETWEEN 0 AND 6 THEN 1 ELSE 0 END)
) / COUNT(base_id) * 100) AS int), 0) AS nps
SELECT CASE
WHEN (SELECT COALESCE(is_five_rating_scale, 'false') = 'true' FROM rating_config) THEN
ROUND(
100.0 * SUM(CASE WHEN feedback_rating_dynamic IN (4, 5) THEN 1 ELSE 0 END)
/ NULLIF(COUNT(base_id), 0),
2
)
ELSE
COALESCE(ROUND(
(
(SUM(CASE WHEN feedback_rating_dynamic BETWEEN 9 AND 10 THEN 1 ELSE 0 END) * 1.0 / NULLIF(COUNT(base_id), 0))
- (SUM(CASE WHEN feedback_rating_dynamic BETWEEN 0 AND 6 THEN 1 ELSE 0 END) * 1.0 / NULLIF(COUNT(base_id), 0))
) * 100,
2
), 0)
END AS nps
FROM chat_csas
),
is_five AS (
SELECT COALESCE(is_five_rating_scale, 'false') = 'true' AS is_five_scale FROM rating_config
)
SELECT json_build_object(
'pointNps', (SELECT json_agg(json_build_object('dateTime', date_time, 'nps', nps)) FROM point_nps),
'periodNps', (SELECT nps FROM period_nps)
) AS result
'periodNps', (SELECT nps FROM period_nps),
'isFiveScale', (SELECT is_five_scale FROM is_five)
) AS result
Loading
Loading