使用 CTE 在 Snowflake 中更新
Update in Snowflake with CTE
我不知道我在这个查询中遗漏了什么,我的 select 正在工作但我的更新
没有
WITH CTE AS
(
select DATE_key ,ITEM_KEY ,location_key ,
INVENTORY_AGE ,rank() over ( Partition by Date_key ,ITEM_KEY ,location_key order by INVENTORY_AGE desc ) as MIN_AGE ,
ISSUED_QUANTITY,
CYCLE_COUNT_QUANTITY,
PURCHASE_RETURN_QUANTITY,
TRANSFER_QUANTITY
from "DWH_FACT_INVENTORY"
where ISSUED_QUANTITy<>0
)
UPDATE CTE
SET ISSUED_QUANTITY = 0
where MIN_AGE <> 1)
在这里更新的目的是什么? CTE 不是实际的 table。如果您只想更新值,您可以使用 CTE table 和用例条件。
此外,您的代码中多了一个结束括号“)”。
WITH CTE AS (
""" your logic""
)
select DATE_key
,ITEM_KEY
,location_key
,INVENTORY_AGE
, case when MIN_AGE <> 1 then 0
else ISSUED_QUANTITY
as ISSUED_QUANTITY
,CYCLE_COUNT_QUANTITY,
,PURCHASE_RETURN_QUANTITY,
,TRANSFER_QUANTITY
from CTE
无法更新 CTE。我看到您想更新 table 中的所有行,除了每个 (Date_key、ITEM_KEY、location_key) 组中的一个行,但我不清楚您是否旨在排除组中最新或最旧的行。您将其命名为 min_age,但看起来您实际上是在查看最大年龄。您也没有指定每个组的最小或最大 INVENTORY_AGE 值是否唯一。无论如何,我希望以下示例能让您了解如何处理这个问题。尝试类似的东西:
UPDATE DWH_FACT_INVENTORY
SET ISSUED_QUANTITY = 0
WHERE ISSUED_QUANTITY <> 0 AND
INVENTORY_AGE <> (
SELECT MAX(INVENTORY_AGE)
FROM DWH_FACT_INVENTORY mdfi
WHERE mdfi.Date_key = DWH_FACT_INVENTORY.Date_key AND
mdfi.ITEM_KEY = DWH_FACT_INVENTORY.ITEM_KEY AND
mdfi.location_key = DWH_FACT_INVENTORY.location_key
)
或类似这样的内容:
UPDATE DWH_FACT_INVENTORY
SET ISSUED_QUANTITY = 0
FROM DWH_FACT_INVENTORY INNER JOIN
(
SELECT Date_key, ITEM_KEY, location_key, MAX(INVENTORY_AGE) AS max_age
FROM DWH_FACT_INVENTORY
GROUP BY Date_key, ITEM_KEY, location_key
) mdfi ON mdfi.Date_key = DWH_FACT_INVENTORY.Date_key AND
mdfi.ITEM_KEY = DWH_FACT_INVENTORY.ITEM_KEY AND
mdfi.location_key = DWH_FACT_INVENTORY.location_key
WHERE ISSUED_QUANTITY <> 0 AND
INVENTORY_AGE <> max_age
我不知道我在这个查询中遗漏了什么,我的 select 正在工作但我的更新
没有WITH CTE AS
(
select DATE_key ,ITEM_KEY ,location_key ,
INVENTORY_AGE ,rank() over ( Partition by Date_key ,ITEM_KEY ,location_key order by INVENTORY_AGE desc ) as MIN_AGE ,
ISSUED_QUANTITY,
CYCLE_COUNT_QUANTITY,
PURCHASE_RETURN_QUANTITY,
TRANSFER_QUANTITY
from "DWH_FACT_INVENTORY"
where ISSUED_QUANTITy<>0
)
UPDATE CTE
SET ISSUED_QUANTITY = 0
where MIN_AGE <> 1)
在这里更新的目的是什么? CTE 不是实际的 table。如果您只想更新值,您可以使用 CTE table 和用例条件。
此外,您的代码中多了一个结束括号“)”。
WITH CTE AS (
""" your logic""
)
select DATE_key
,ITEM_KEY
,location_key
,INVENTORY_AGE
, case when MIN_AGE <> 1 then 0
else ISSUED_QUANTITY
as ISSUED_QUANTITY
,CYCLE_COUNT_QUANTITY,
,PURCHASE_RETURN_QUANTITY,
,TRANSFER_QUANTITY
from CTE
无法更新 CTE。我看到您想更新 table 中的所有行,除了每个 (Date_key、ITEM_KEY、location_key) 组中的一个行,但我不清楚您是否旨在排除组中最新或最旧的行。您将其命名为 min_age,但看起来您实际上是在查看最大年龄。您也没有指定每个组的最小或最大 INVENTORY_AGE 值是否唯一。无论如何,我希望以下示例能让您了解如何处理这个问题。尝试类似的东西:
UPDATE DWH_FACT_INVENTORY
SET ISSUED_QUANTITY = 0
WHERE ISSUED_QUANTITY <> 0 AND
INVENTORY_AGE <> (
SELECT MAX(INVENTORY_AGE)
FROM DWH_FACT_INVENTORY mdfi
WHERE mdfi.Date_key = DWH_FACT_INVENTORY.Date_key AND
mdfi.ITEM_KEY = DWH_FACT_INVENTORY.ITEM_KEY AND
mdfi.location_key = DWH_FACT_INVENTORY.location_key
)
或类似这样的内容:
UPDATE DWH_FACT_INVENTORY
SET ISSUED_QUANTITY = 0
FROM DWH_FACT_INVENTORY INNER JOIN
(
SELECT Date_key, ITEM_KEY, location_key, MAX(INVENTORY_AGE) AS max_age
FROM DWH_FACT_INVENTORY
GROUP BY Date_key, ITEM_KEY, location_key
) mdfi ON mdfi.Date_key = DWH_FACT_INVENTORY.Date_key AND
mdfi.ITEM_KEY = DWH_FACT_INVENTORY.ITEM_KEY AND
mdfi.location_key = DWH_FACT_INVENTORY.location_key
WHERE ISSUED_QUANTITY <> 0 AND
INVENTORY_AGE <> max_age