Мне нужно сделать случай, когда на вложенной таблице. Таблица выглядит так:

enter image description here

Я хочу взять каждый идентификатор клиента и количество их выполненных рефералов. Завершенные правила перехода: isActive Yes, balanceFullfilment Yes и disbursmentStatus Yes.

Результат может выглядеть так:

+------------------------------+-------------------------+
|   CustomerId                 |   completedReferrals    |
+------------------------------+-------------------------+
|  5ee3069303e3ba522d200ecf    |           0             |    
|  0330633746                  |           1             |
|  5ecf73d14dc2ad166325a447    |           0             |
|  5f0ece768b16a2aa59ab31f3    |           0             |    
+------------------------------+-------------------------+

Я думаю это похоже на

SELECT SUM(CASE WHEN isActive = 'Yes' and balanceFullfillment = 'Yes' and disbursementStatus = 'Yes' then 1 else 0)

Но я не знаю, как это сделать на вложенной таблице, может кто-нибудь помочь?

1
ebuzz168 8 Июн 2021 в 12:15

2 ответа

Лучший ответ

Я настоятельно рекомендую использовать unnest() в таком подзапросе:

SELECT t.customerId,
       (SELECT COUNT(*)
        FROM UNNEST(t.referee) r
        WHERE r.isActive = 'Yes' and 
              r.balanceFullfillment = 'Yes' and 
              r.disbursementStatus = 'Yes' 
      ) as completedReferrals
FROM t;

Избегание внешней агрегации должно сделать запрос намного быстрее (избегая перемещения данных, необходимого для внешней агрегации) и использовать меньше ресурсов. Кроме того, это работает, даже когда CustomerId повторяется в разных строках.

2
Gordon Linoff 8 Июн 2021 в 11:07

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

Здесь вы выбираете идентификатор, и на каждый идентификатор вы рассчитываете, только если условия, которые вы добавили выше, выполнены.

select 
    CustomerId,
    SUM(CASE WHEN isActive = 'Yes' and balanceFullfillment = 'Yes' and disbursementStatus = 'Yes' then 1 else 0) as completedReferrals
    
    from table x
    group by 1
0
trillion 8 Июн 2021 в 09:29