Обновление в снежинке с CTE - PullRequest
0 голосов
/ 06 марта 2020

Я не могу понять, что мне не хватает в этом запросе, мой выбор работает, но не мое обновление

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)

Ответы [ 2 ]

1 голос
/ 07 марта 2020

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
1 голос
/ 06 марта 2020

Какова цель обновления здесь? 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...