0

我无法弄清楚我在这个查询中缺少什么,我的选择正在工作,但不是我的更新

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)
4

2 回答 2

3

无法更新 CTE。我看到您想要更新表中的所有行,除了每个 (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
于 2020-03-06T21:27:16.880 回答
2

在这里更新的目的是什么?CTE 不是实际表格。如果您只想更新值,则可以使用该 CTE 表和用例条件。

此外,您的代码中还有一个额外的结束括号“)”。

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
于 2020-03-06T20:02:08.733 回答