我在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) 的方式也是可以接受的。
我正在尝试实现旋转输出,但无法产生预期结果。
您可以尝试通过
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 %}
)
)