--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