我目前有这个查询,它通过它的
updated_at
列过滤最新记录,并查找具有特定类型的行。我正在尝试展平数组,以便我可以提取特定对象数据,但我认为我没有正确使用lateral flatten()
。
该行的数据如下所示:
[{ "token": "1234", type: "STORE" }, { "token": "4567", type: "MERCHANT" }]
雪花查询:
with unique_merchants as (
select
updated_at,
aliases,
merchant_token,
identity_token,
row_number() over (
partition by merchant_token
order by
updated_at desc
) as row_number
from
table.PUBLIC.business_info
)
select
identity_token,
merchant_token,
aliases
from
unique_merchants
inner join table.PUBLIC.stores on table.PUBLIC.stores.parent_token = merchant_token,
lateral flatten(aliases) as obj
where
value:type = 'STORE'
and row_number = 1;
现在这个查询给了我half我需要的东西。输出返回在其
STORE
列中具有 ALIAS
类型对象的所有行。我还希望能够从 STORE
类型的对象中提取令牌,但这就是我遇到麻烦的地方。我已经尝试在我创建的 CTE 和第二个 FROM
子句中分解行,但仍然没有运气。
我能够通过在 CTE 之外的选择中添加
value:token::string
来获得我需要的东西。
为了进一步简化查询,可以在 CTE 中基于窗口函数过滤行:
with unique_merchants as (
select updated_at,
aliases,
merchant_token,
identity_token
from table.PUBLIC.business_info
qualify row_number() over (partition by merchant_token order by updated_at desc)=1
)
select
identity_token,
merchant_token,
aliases,
obj.value:token:TEXT
from unique_merchants
join table.PUBLIC.stores
on table.PUBLIC.stores.parent_token = merchant_token
,lateral flatten(unique_merchants.aliases) as obj
where obj.value:type::TEXT = 'STORE';