2013-12-16 3 views
2

ниже - это оракул SQL, и я хочу изменить его в формате Teradata.QUALIFY ROW_NUMBER в teradata

SELECT branch_code, 
    branch_no, 
    c_no, 
    cd_type 
FROM (
    SELECT branch_code, 
     branch_no, 
     c_no, 
     cd_type, 
     * * RANK() OVER (
      PARTITION BY c_no ORDER BY cd_type 
      ) RANK * * 
    FROM (
     SELECT branch_code, 
      branch_no, 
      c_no, 
      MIN(cd_type) cd_type 
     FROM EMPLOYEE 
     WHERE S_CODE = 'C' 
      AND (branch_no) NOT IN (
       SELECT branch_code 
       FROM DEPARTMENT 
       WHERE branch_code = 'ABC' 
       ) 
     ) 
    ) 
WHERE RANK = 1 

Я использовал QUALIFY для RANK, как показано ниже.

SELECT branch_code, 
    branch_no, 
    c_no, 
    cd_type 
FROM (
    SELECT branch_code, 
     branch_no, 
     c_no, 
     cd_type, 
     * * QUALIFY ROW_NUMBER() OVER (
      PARTITION BY c_no ORDER BY cd_type 
      ) * * RANK 
    FROM (
     SELECT branch_code, 
      branch_no, 
      c_no, 
      MIN(cd_type) cd_type 
     FROM EMPLOYEE 
     WHERE S_CODE = 'C' 
      AND (branch_no) NOT IN (
       SELECT branch_code 
       FROM DEPARTMENT 
       WHERE branch_code = 'ABC' 
       ) 
     ) 
    ) 
WHERE RANK = 1 

Но получаю ошибку, что «Прогнозный что-то между ними, и квалифицироваться.

Можно положить QUALIFY в операторе отбора?

ответ

2

Вы, вероятно, упростили существующий запрос, так как это не действует Oracle SQL (там нет GROUP BY в Inline View). Плюс вы сравниваете branch_no с branch_code в НЕ В.

В противном случае ответ Эда Гиббса может быть дополнительно упрощено до:

SELECT branch_code, 
    branch_no, 
    c_no, 
    MIN(cd_type) cd_type 
FROM EMPLOYEE 
WHERE S_CODE = 'C' 
    AND (branch_no) NOT IN (
     SELECT branch_no 
     FROM DEPARTMENT 
     WHERE branch_code = 'ABC' 
     ) 
GROUP BY branch_code, 
    branch_no, 
    c_no 
QUALIFY 
    RANK() 
    OVER (PARTITION BY c_no 
     ORDER BY MIN(cd_type) = 1 

Если branch_no определяется как NULLABLE вы должны также переписать NOT IN в NOT EXISTS

2

Обычно, аналитические значения, как RANK вычисляются вторые до последнего, после присоединения и фильтрация и GROUP BY и HAVING. Единственное, что сделано после аналитических значений, это ORDER BY. Вот почему в Oracle вам нужно поместить RANK во внутренний запрос, а затем проверить его значение во внешнем запросе. В Teradata QUALIFY выполняется после аналитические функции и до ORDER BY, то есть вам не нужен внешний запрос для проверки значения RANK.

У меня нет доступа к Teradata сегодня, так что этот запрос не проверял, но мне нравится думать, что это близко:

SELECT branch_code, 
    branch_no, 
    c_no, 
    cd_type 
FROM (
    SELECT branch_code, 
     branch_no, 
     c_no, 
     MIN(cd_type) cd_type 
    FROM EMPLOYEE 
    WHERE S_CODE = 'C' 
     AND (branch_no) NOT IN (
      SELECT branch_code 
      FROM DEPARTMENT 
      WHERE branch_code = 'ABC' 
     ) 
) 
QUALIFY ROW_NUMBER() OVER (PARTITION BY c_no ORDER BY cd_type) = 1 
+1

Спасибо это было полезно. – navku

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