需要有关将单条记录插入目标的指导 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,但需要更少的层,但意图更密集。
我在来源 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,但需要更少的层,但意图更密集。