Files
dbt_cloud/models/marts/warehouse/fct_crisp__dialogs.sql
T
2023-05-09 09:53:28 +00:00

176 lines
7.8 KiB
SQL

--IMPORT
WITH messages AS (
SELECT * FROM {{ ref('int_crisp__messages_generate_dialog_ids') }}
ORDER BY conversation_id, created_datetime, message_id
),
--LOGIC
messages_with_ftu_id AS (
SELECT
*,
FIRST_VALUE(CASE WHEN messages.message_generated_by = 'user' THEN messages.user_id END)
IGNORE NULLS
OVER (PARTITION BY messages.dialog_id ORDER BY messages.created_datetime ASC) AS first_user_id,
LAST_VALUE(CASE WHEN messages.message_generated_by = 'user' THEN messages.user_id END)
IGNORE NULLS
OVER (PARTITION BY messages.dialog_id ORDER BY messages.created_datetime ASC) AS last_user_id,
FIRST_VALUE(CASE WHEN messages.message_generated_by = 'operator' THEN messages.user_id END)
IGNORE NULLS
OVER (PARTITION BY messages.dialog_id ORDER BY messages.created_datetime ASC) AS first_operator_id,
LAST_VALUE(CASE WHEN messages.message_generated_by = 'operator' THEN messages.user_id END)
IGNORE NULLS
OVER (PARTITION BY messages.dialog_id ORDER BY messages.created_datetime ASC) AS last_operator_id
from messages
),
dialog_message_last_row AS (
SELECT
RANK() OVER (PARTITION BY dialog_id ORDER BY created_datetime DESC) AS last_row_desc_rank,
*
FROM messages
QUALIFY last_row_desc_rank = 1
),
transform_to_dialogs AS (
SELECT
messages_with_ftu_id.dialog_id AS dialog_id,
max(messages_with_ftu_id.conversation_id) AS conversation_id,
array_agg(messages_with_ftu_id.message_id) AS message_ids,
CASE
WHEN max(dialog_message_last_row.event_type) = 'state:resolved' THEN 'close'
WHEN max(dialog_message_last_row.event_type) IS NULL THEN 'open'
ELSE 'ERROR, Please contact DATA team'
END AS dialog_status,
min(messages_with_ftu_id.created_datetime) AS dialog_created_datetime,
min(IFF(messages_with_ftu_id.message_generated_by = 'user',
messages_with_ftu_id.created_datetime,
null)) AS first_user_reply_datetime,
min(IFF(messages_with_ftu_id.message_generated_by = 'operator',
messages_with_ftu_id.created_datetime,
null)) AS first_operator_reply_datetime,
min(IFF(messages_with_ftu_id.message_generated_by = 'bot',
messages_with_ftu_id.created_datetime,
null)) AS first_bot_reply_datetime,
max(IFF(messages_with_ftu_id.message_generated_by = 'user',
messages_with_ftu_id.created_datetime,
null)) AS last_user_reply_datetime,
max(IFF(messages_with_ftu_id.message_generated_by = 'operator',
messages_with_ftu_id.created_datetime,
null)) AS last_operator_reply_datetime,
max(IFF(messages_with_ftu_id.message_generated_by = 'bot',
messages_with_ftu_id.created_datetime,
null)) AS last_bot_reply_datetime,
max(IFF((messages_with_ftu_id.event_type = 'state:resolved'),
messages_with_ftu_id.created_datetime,
null)) AS dialog_solved_datetime,
array_agg(distinct(
IFF(messages_with_ftu_id.message_generated_by = 'user' ,
messages_with_ftu_id.user_id,
NULL))) AS user_ids,
count(distinct(
IFF(messages_with_ftu_id.message_generated_by = 'user',
messages_with_ftu_id.user_id,
null))) AS number_of_user_involved,
max(messages_with_ftu_id.first_user_id) AS first_user_id,
max(messages_with_ftu_id.last_user_id) AS last_user_id,
array_agg(distinct(
IFF(messages_with_ftu_id.message_generated_by = 'operator' ,
messages_with_ftu_id.user_id,
NULL))) AS operator_ids,
count(distinct(
IFF(messages_with_ftu_id.message_generated_by = 'operator',
messages_with_ftu_id.user_id,
null))) AS number_of_operator_involved,
max(messages_with_ftu_id.first_operator_id) AS first_operator_id,
max(messages_with_ftu_id.last_operator_id) AS last_operator_id,
count(distinct(
IFF(messages_with_ftu_id.message_generated_by = 'user',
messages_with_ftu_id.message_id,
null))) AS number_of_user_chat,
count(distinct(
IFF(messages_with_ftu_id.message_generated_by = 'operator',
messages_with_ftu_id.message_id,
null))) AS number_of_operator_chat,
count(distinct(
IFF(messages_with_ftu_id.message_generated_by = 'bot',
messages_with_ftu_id.message_id,
null))) AS number_of_bot_chat,
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
FROM messages_with_ftu_id
LEFT JOIN dialog_message_last_row
ON (dialog_message_last_row.dialog_id = messages_with_ftu_id.dialog_id)
GROUP BY
messages_with_ftu_id.dialog_id
),
-- FINAL
final_fct_crisp__dialogs AS (
SELECT
-- ids
dialog_id,
conversation_id,
message_ids,
user_ids,
operator_ids,
first_user_id,
last_user_id,
first_operator_id,
last_operator_id,
-- dimensions
dialog_status,
-- measures
number_of_user_involved,
number_of_operator_involved,
number_of_user_chat,
number_of_operator_chat,
number_of_bot_chat,
-- date/times
dialog_created_datetime,
dialog_solved_datetime,
first_user_reply_datetime,
first_operator_reply_datetime,
first_bot_reply_datetime,
last_user_reply_datetime,
last_operator_reply_datetime,
last_bot_reply_datetime,
-- metadata
_dbt_ran_datetime
FROM transform_to_dialogs
)
SELECT * FROM final_fct_crisp__dialogs