是否有更好的方法循环遍历列以获取特定值?

问题描述 投票:0回答:1

我正在建立一个与美国各州打交道的查找表。在其中一列中

bigquery
我有一堆值,例如:
key
code
provider
referral
state
phone_call
键中的值与 

video_call

字段和

value_type
字段相对应。 我需要将
value
字段中的值放入一列中,并将
key
字段中的值分配给它。最重要的是,我只需要获得
value
provider
referral
phone_call
。我目前正在做一个
video_call
,但感觉有点笨拙。
示例代码如下所示:

case statement

我的代码目前如下所示:

id|name |code|state_id|key |label |value_type|value | --+----------+----+--------+-------------------------------------+---------------------------------+----------+----------+ 52|Porto Rico|PR | 52|phone_call |Phone Call |boolean |0 | 52|Porto Rico|PR | 52|video_call |Video Call |boolean |0 | 52|Porto Rico|PR | 52|code |Code |text |PR | 52|Porto Rico|PR | 52|referral |Referral |select |ASYNC | 52|Porto Rico|PR | 52|provider |Provider |boolean |false | 52|Porto Rico|PR | 52|state |State |text |Porto Rico|

有没有比使用 case 语句更好的方法来处理这个问题?我觉得这有点笨拙,但因为我只需要 
SELECT state_id , name AS state , code , CASE WHEN key = "provider" THEN value END AS provider , CASE WHEN key = "referral" THEN value END AS referral , CASE WHEN key = "phone_call" THEN value END AS phone_call , CASE WHEN key = "video_call" THEN value END AS video_call FROM {{ ref('enrich_states')}}

中的特定值,我想不出另一种方法来使其更干净。请问我可以得到一些帮助吗?

    
我相信你有两个选择。

sql dbt
1个回答
0
投票
使用

Pivot 功能

(在 BigQuery 中可用,但通常也可在其他数据库中使用):
  1. DBT
第一部分包含
key
。如果您不想预定义键列表,则适用这种情况(请参阅详细信息
    此处
  • )。如果您预先知道它们,只需将第一部分替换为
    -- FIRST PART
    {% set keys_query %}
    SELECT DISTINCT key FROM {{ ref('enrich_states') }}
    {% endset %}
    
    {% set results = run_query(keys_query) %}
    
    {% if execute %}
    {% set results_list = results.columns[0].values() %}
    {% else %}
    {% set results_list = [] %}
    {% endif %}
    
    -- SECOND PART
    SELECT * FROM {{ ref('enrich_states') }}
    PIVOT(MAX(value) FOR key IN (
      {% for key in results_list %}
        '{{ key }}'
        {% if not loop.last %},{% endif %}
      {% endfor %}
    ))
    
    要使
    run_query
    工作,您需要将
  • {% set results_list = ['phone_call', 'video_call','code'] %}
  • 添加到您的
    run_query
    并运行
    dbt_utils
    
    
    packages.yml
第二部分包含 PIVOT 运算符调用和 for 循环。请参阅 dbt 中有关循环的详细信息
此处
  • 或者,您可以简单地将
  • for 循环
添加到您的初始代码中:
  1. dbt deps
我还没有在实际环境中测试过,所以如果您遇到任何错误请告诉我
    

© www.soinside.com 2019 - 2024. All rights reserved.