2017-01-27 6 views
0

Я был бы признателен за помощь в этом коде, я получаю сообщение об ошибке «missing keyword». Я никогда раньше не использовал функцию Lag, поэтому, надеюсь, я правильно ее использую. Спасибо за вашу помощь. ГавOracle SQL LAG Function

CREATE VIEW GS_Date AS 
SELECT       
     DATE_DATE, 
     DATE_FLAG, 
     CASE WHEN LAG (DATE_FLAG) OVER (ORDER BY DATE_DATE) = '1' THEN DATE_STEP = (LAG (DATE_FLAG) OVER (ORDER BY DATE_DATE)) + '1' 
       WHEN LAG (DATE_FLAG) OVER (ORDER BY DATE_DATE) = '0' AND LAG (DATE_FLAG) OVER (ORDER BY DATE_DATE) = '-1' THEN DATE_STEP = (LAG (DATE_FLAG) OVER (ORDER BY DATE_DATE)) + '1' 
       ELSE DATE_STEP = LAG (DATE_FLAG) OVER (ORDER BY DATE_DATE) END AS DATE_STEP 
FROM DATE_GROUP     
+1

Вы не можете назначать переменные или столбцы, используя 'DATE_STEP = ...' в инструкции SQL. Не связано с ошибкой: 'lag()' возвращает число, не сравнивая его со строкой. '' 1'' является строковой константой. '1' - это число. –

+1

Чтобы найти ошибку, временно пропустите случай и попробуйте одну LAG в это время. – jarlh

+0

Благодарим вас за помощь, сейчас работаю. – Gavin

ответ

0

Попробуйте как этот

CREATE VIEW GS_Date AS 
SELECT DATE_DATE, 
     DATE_FLAG, 
     CASE 
     WHEN LAG(DATE_FLAG) OVER(ORDER BY DATE_DATE) = '1' THEN 
      (LAG(DATE_FLAG) OVER(ORDER BY DATE_DATE)) + '1' 
     WHEN LAG(DATE_FLAG) OVER(ORDER BY DATE_DATE) = '0' AND LAG(DATE_FLAG) OVER(ORDER BY DATE_DATE) = '-1' THEN 
      (LAG(DATE_FLAG) OVER(ORDER BY DATE_DATE)) + '1' 
     ELSE 
      LAG(DATE_FLAG) OVER(ORDER BY DATE_DATE) 
     END AS DATE_STEP 
    FROM DATE_GROUP 
+2

Не добавляйте строки, такие как '' 1'', ​​цифры! Если бы ПП сделал это, и вы пытаетесь помочь им, это не трудно распознать и указать, даже если это не причина ошибки, с которой они столкнулись. – mathguy

2

проблема с выражением МИОНа вы правильно использовали LAG.

Другие пункты: Не добавляйте строки, такие как '1' и '-1'. Добавить числа - вам не нужны одиночные кавычки.

Кроме того, если в вычислении что-то распространено, и только «последняя часть» отличается, вы можете использовать выражение CASE «в конце». Как показано ниже:

Примечание: При повторном чтении исходного сообщения формула должна быть более сложной (я не понял ее точно). Не меняя ответа, так как он по-прежнему иллюстрирует те же идеи, что и я. НО: Глядя на исходный пост, есть условие «when LAG = 0 and LAG = -1» - это никогда не может быть правдой. Это означало, вероятно, «ИЛИ» вместо «И». В приведенной ниже формуле это означает еще одну ветку WHEN...THEN....

LAG(DATE_FLAG) OVER (ORDER BY DATE) 
     + CASE LAG(DATE_FLAG) OVER (ORDER BY DATE) WHEN 1 THEN 1 
                WHEN 0 THEN -1 
                ELSE   0 END AS DATE_STEP 

Далее редактировать: Глядя на нее еще раз, кажется, когда флаг равен 1, 0 или -1, то мы должны добавить 1, в противном случае добавьте 0 ... то проще использовать «простой случай выражение «вместо« искаженного выражения CASE », как я. Что-то вроде:

LAG(...) ... 
    + CASE WHEN LAG(...) ... IN (-1, 0, 1) THEN 1 
      ELSE         0 END AS DATE_STEP 
0

Таким образом, вы не должны продолжать писать LAG(...) OVER (...) заявления, получить значение LAG в суб-запроса, а затем использовать CASE или DECODE во внешнем запросе:

CREATE VIEW GS_Date AS 
SELECT DATE_DATE, 
     DATE_FLAG, 
     DECODE(
      DATE_STEP, 
      1, 2, 
      0, 1, 
      -1, 0, 
      DATE_STEP 
     ) AS DATE_STEP 
FROM (
    SELECT DATE_DATE, 
      DATE_FLAG, 
      LAG (DATE_FLAG) OVER (ORDER BY DATE_DATE) AS DATE_STEP 
    FROM DATE_GROUP 
)' 

Также , ваш второй WHEN пункт никогда не будет верно:

WHEN LAG (DATE_FLAG) OVER (ORDER BY DATE_DATE) = '0' 
AND LAG (DATE_FLAG) OVER (ORDER BY DATE_DATE) = '-1' 
THEN ... 

Поскольку значение не может быть одновременно -1 и 0. Я предположил, что вы хотели использовать OR, а не AND.

Смежные вопросы