雪花是否可以"merge"数组输出到表查询



我有两个输入:

a。表A有3列:A、b、c-有7行

b。表B中有一个数组列d,该数组有7个值。

有没有办法";合并";查询中的表A和表B,这样A的第一行和B的第一个单元格值将打印在同一行中?

输入:

例如:

Table A- Column 1   

a          
b       
c
Table A- Column 2

d
e
f

Table b - column 1 (and only)

k
r
j

输出

三列

前两列:a、b列(来自表a(第三列-即表2中的第1列

您可以使用Flatten将数组转换为表。然后,您只需要定义排序以及如何将它们连接在一起。

这里有一个例子,我使用ROW_NUMBER((来提供排序。由于我将它添加到了表A和扁平表B中,因此它也可以用于将记录连接在一起。

如果您有用于排序或连接的ID,那么这可能会稍微干净一些,但对于示例中提供的简单列,您需要执行类似的操作,将数组值与表行对齐。

with tA as (
select col1, col2,
ROW_NUMBER() OVER(ORDER BY col1) rnum
from tableA 
)
,tB as (
select 
x.value::string col1,
ROW_NUMBER() OVER(ORDER BY 1) rnum
from tableB ,
lateral flatten(input =>  array) x
)
SELECT a.col1, a.col2, b.col1
FROM tA a
JOIN tB b
ON a.rnum = b.rnum;

没有"第一行";在数据库中。对于您在数据上下的订单,存在第一个。因此,有许多方法可以仅获得";第一行";

On是只选择第一行,我将使用CTE,但也可以在子选择中完成。通过QUALIFY和ROW_NUMBER,为了使其"稳定",我将使用选定的输出列。在那之后,我将使用CROSS-JOIN来连接这两个表,但如果两个CTE中只有一行,这将只提供一个输出行。但这并不是你想要的。

WITH first_from_table_a AS (
SELECT column1, column2
FROM table_a
QUALIFY ROW_NUMBER() OVER (ORDER BY column1) = 1
), first_from_table_b AS (
SELECT column1
FROM table_b
QUALIFY ROW_NUMBER() OVER (ORDER BY column1) = 1
)
SELECT a.column1, a.column2, b.column1
FROM first_from_table_a AS a
CROSS JOIN first_from_table_b AS b

问题是,如果你还想做其他事情,那就没有规模。

FIRST_VALUE是一个函数,如果您将数据连接到其他模式上,并希望从更大的集合中选择一个值,它也会有所帮助,但实际上这个问题需要进一步澄清。

另一种考虑问题的方法是使用相同的ROW_NUMBER想法,并加入其中,因此:

WITH first_from_table_a AS (
SELECT column1,
column2,
ROW_NUMBER() OVER (ORDER BY column1) AS rn
FROM table_a
), first_from_table_b AS (
SELECT column1,
ROW_NUMBER() OVER (ORDER BY column1) AS rn
FROM table_b
)
SELECT a.column1, a.column2, b.column1
FROM first_from_table_a AS a
JOIN first_from_table_b AS b
ON a.rn = b.rn
ORDER BY a.rn

最新更新