需要有关将单条记录插入目标的指导 table

Need guidance in inserting single record into target table

我在来源 table 中有多个记录。我必须将记录从源 table 插入到目标 table。为此,我需要根据 ITEM_NO 对所有记录进行排序,并为 ITEM_SEARCH_CATEGORY 列取最后的 NOT NULL 值。

如果源中总共有 5 条记录,如果 ITEM_SEARCH_CATEGORY 的第五条记录是 NULL,那么我需要取第四条记录并插入目标 table。

同样,如果 ITEM_SEARCH_CATEGORY 列的最后 2 条记录是 NULL,那么我需要获取第 3 条记录并将其插入到目标 table.

如何为此逻辑编写正确的查询?

ID          DATE          ITEM_NO        ITEM_SEARCH_CATEGORY
12538648    2022-03-03    201            itemsearch:input:suggestion
12538648    2022-03-03    175            NULL
12538648    2022-03-03    160            itemsearch:standard
12538648    2022-03-03    213            itemsearch:input:suggestion
12538648    2022-03-03    198            NULL

我试过下面的方法,但我认为这似乎不对。

SELECT distinct
    ID,
    DATE,
    ITEM_NO,
    ITEM_SEARCH_CATEGORY
FROM TABLE_1 A JOIN TABLE_2 B
ON B.IID=A.IID
WHERE DATE='2021-11-06'
    AND ID=12538648
QUALIFY row_number() over (partition by ID order by DATE desc) = 1

有 WINDOW 个函数,例如 LAST_VALUE、LAG、MAX、MIN,它们根据函数的逻辑为该列选择一个值。在 Snowflake 中,他们有一个很好的 IGNORE NULLS 子句:

GROUPS ORDERS VALUES
a 1 100
a 2 200
a 3 null
b 1 101
b 2 201
b 3 301

因为我们可以 PARTITION BY groups 然后 ORDER BY orders 得到 LAST_VALUE

又名

LAST_VALUE(values) IGNORE NULLS OVER (PARITION BY groups ORDER BY orders) as values

并将其插入 table,但它们是“每行”selecting LAST_VALUE,因此如果我们 select 我们 [=57] 中的所有内容=],以及 SQL 定义的 LAST_VALUE,我们将有

GROUPS ORDERS VALUES LAST_VALUE
a 1 100 200
a 2 200 200
a 3 null 200
b 1 101 301
b 2 201 301
b 3 301 301

因此 WINDOW FUNCTIONs select 此列的 future/prior ROWS 的 WINDOW 的单个值。

然后我们会遇到 selecting/filter 那些行减少到只有一行的问题。所以你可以使用你在很多地方做过的 DISTINCT。或者您可以使用 WHERE 子句或 QUALIFY。但是你必须考虑你想要的行的其他值。

那么对于示例数据,您是否要将值插入到结果中

GROUPS ORDERS VALUES
a 3 200
b 3 301

这是最后一行,有 LAST_VALUE 个 VALUES,或者你想要,或者它也可以是 MAX(ORDERS), MAX(VALUES)

或者您是否需要具有最大 VALUES 的非空行的相关详细信息,又名

GROUPS ORDERS VALUES
a 2 200
b 3 301

此时您将需要某种形式或 ROW_NUMBER/RANK 然后 WHERE 最好 (=1) 或使用相同的单行 QUALIFY,但需要更少的层,但意图更密集。