我正在建立一个与美国各州打交道的查找表。在其中一列中
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')}}
中的特定值,我想不出另一种方法来使其更干净。请问我可以得到一些帮助吗?
我相信你有两个选择。
Pivot 功能
(在 BigQuery 中可用,但通常也可在其他数据库中使用):第一部分包含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
此处添加到您的初始代码中:我还没有在实际环境中测试过,所以如果您遇到任何错误请告诉我