СЛУЧАЙ, КОГДА оператор ссылается на два разных столбца

#sql

Вопрос:

Как вы можете видеть на скриншоте ниже, существует несколько номеров учетных записей, которые имеют либо «успешный», либо «неудачный» результат. Некоторые номера учетных записей содержат несколько записей, таких как номер учетной записи «413655». Для таких учетных записей, как «413655», где один результат-успех, а другой-неудача, я хочу создать новый столбец, в котором отображается «успех» для обеих записей. Только учетные записи, у которых есть все результаты сбоя, должны отображать «сбой» в этом новом столбце «Distinct_count». Остальные должны отображать «успех».

СКРИНШОТ: https://i.stack.imgur.com/NQZmY.jpg

Пожалуйста, найдите мой запрос ниже.(Я выделил жирным шрифтом часть, которую необходимо отредактировать)

 -- @WbResult v_tcci_collection_activity_fact
SELECT date_dim_id,
B.user_key,
B.product_type,
B.dealer_nbr,
(CASE B.make
WHEN 'TOYOTA' THEN 'TOYOTA'
WHEN 'SUBARU' THEN 'SUBARU'
WHEN 'LEXUS' THEN 'LEXUS'
ELSE 'OTHER'
END),
C.dealer_name,
C.zone,
activity_date,
activity_time,
activity_code,

 

(CASE WHEN len(b.loan_nbr) > 3 
THEN b.loan_nbr
ELSE b.lease_nbr END)
AS account_number,

 

(CASE WHEN activity_code IN ('SHPS','SBPS','SOPS','SHCS','SBCS') THEN 'Successful'
ELSE 'Fail' END)
AS outcome,


**(CASE WHEN outcome = 'Successful' AND outcome = 'Fail' OR outcome = 'Successful' THEN 'Successful'
ELSE 'Fail' END)
AS distinct_count** 



 

FROM dm_business_ops_tcci.v_tcci_collection_activity_fact A
left join dm_business_ops_tcci.v_tcci_collection_account_dim B
on A.collection_account_dim_id = B.collection_account_dim_id
left join dm_business_ops_tcci.v_tcci_dealer_dim C
on A.dealer_dim_id = C.dealer_dim_id
where activity_code IN ('SBCS','SOPF','SBPS','SOPS','SHPF','SHPS','SBCF','SBPF','SHCF','SHCS')
 

Ответ №1:

В вашем примере трудно проанализировать весь запрос целиком, но в вашем сценарии оконная функция является хорошим способом реализации этого сценария.

Ваш запрос не будет работать, так как он выполняет действия только строка за строкой, поэтому вам нужно иметь возможность получать сведения из другой строки, чтобы это произошло.

В вашем случае вы хотите использовать оконную функцию, подобную следующей (упрощенной из вашего конкретного примера):

 MAX(outcome) OVER (PARTITION BY account_number) AS outcome_overall
 

Здесь я веду себя немного дешево, и Successful в словаре нет ничего, что Fail можно было бы использовать после MAX этого . Но при этом outcome_overall рассчитывается по:

  1. Разбиение набора данных на отдельные фрагменты на основе account_number .
  2. Внутри каждого раздела он находит MAX(outcome) .
  3. outcome_overall это значение из #2, повторяющееся для каждой строки в этом разделе.

Примеры данных и что outcome_overall было бы:

account_number outcome outcome_overall
A1 Успешный Успешный
A1 Провал Успешный
A2 Провал Провал
A2 Провал Провал
A3 Успешный Успешный
А4 Провал Провал