dbt 转换 - 旋转

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

我在oracle数据库中有下面的source_data,

{{ config(materialized='table') }}

with source_data as (
    select 
        sd.field_value,
        af.adco_field_name
    from 
        {{ source('adco', 'sow_src_data') }} sd
        join {{ source('adco', 'src_field') }} sf on sd.src_field_id = sf.src_field_id
        join {{ source('adco', 'src_mapping') }} sm on sm.src_field_id = sf.src_field_id
        join {{ source('adco', 'adco_field') }} af on af.adco_field_id = sm.adco_field_id
    where 
        effective_date = '2024-02-08'
),

我想旋转 source_data 以使 adco_field_name 行作为列,并将相应的 field_value 作为每列的值。

source_data 示例,为简单起见仅提供了 5 行,实际数据集包含 100 多行,因此硬编码“ADCO_FIELD_NAME”是不切实际的

ADCO_FIELD_NAME | FIELD_VALUE
--------------- | -----------
SV6M10YP        | 15.7
LIBOR180        | 7.95
LIBOR240        | 8.02
Cofi11          | 11.848

预期产出,

SV6M10YP | LIBOR180 | LIBOR240 | Cofi11
---------|----------|----------|---------
15.7     | 7.95     | 8.02     | 11.848

如果上述过程在 Oracle 中实现起来比较繁琐,那么 Microsoft SQL Server (MSSQL) 的方式也是可以接受的。

我正在尝试实现旋转输出,但无法产生预期结果。

pivot-table dbt
1个回答
0
投票

您可以尝试通过

run_query
dbt 宏使用 Oracle Pivot 功能。我假设您将
source_data
查询放入单独的 dbt 模型中。

{% set field_names_query %}
SELECT DISTINCT adco_field_name FROM {{ ref('source_data') }}
{% endset %}

{% set results = run_query(field_names_query) %}

{% if execute %}
{% set results_list = results.columns[0].values() %}
{% else %}
{% set results_list = [''] %}
{% endif %}

SELECT * FROM {{ ref('source_data') }}
PIVOT
  (
  MAX(FIELD_VALUE)
  FOR ADCO_FIELD_NAME IN (
    {% for field_name in results_list %}
    '{{ field_name }}' {% if not loop.last %},{% endif %}
    {% endfor %}
    )
  )
© www.soinside.com 2019 - 2024. All rights reserved.