2015-03-12 3 views
0

Я пытаюсь ранжировать мои данные о продажах, используя функцию rank() over. Вот мой код:Рейтинг в Teradata- SQL

Select 
Category as CAT 
,units*cost as COST_SALES 
,units*retail as RETAIL_COST 
,units as UNITS_SOLD 
,RANK() OVER (PARTITION BY 1 ORDER BY 3 DESC) AS RANKING 

from Table 

Where date between current_date-7 and current_date 
group by 1 

Когда я получу свой результат, он неупорядочен и показывает ранг 1 для всех категорий.

ответ

0

Вы не можете использовать ссылки столбца в функциях окна. Вам нужно явно указать столбцы:

Select Category as CAT, units*cost as COST_SALES, units*retail as RETAIL_COST, 
     units as UNITS_SOLD, 
     RANK() OVER (PARTITION BY Categroy ORDER BY units*retail DESC) AS RANKING 
from Table 
Where date between current_date-7 and current_date 
group by Category; 
+0

Teradata позволит вам использовать псевдонимы внутри одного и того же запроса. Таким образом, вы можете использовать «RANK() OVER (PARTITION by Category order by Retail_Cost)». – Andrew

+0

Эндрю. , , Это интересно. Как бы он обрабатывал что-то вроде: 'select (x * x) как x, x from (select 10 as x) a'. ANSI не требует порядка оценки выражений, и большинство баз данных не гарантируют его. –

+0

Teradata выполнит этот оператор и вернет два столбца с именем x. Тем не менее, 'select x from (select (x * x) as x, x from (select 10 as x) a) t' сбой с ошибкой« Дублирование столбца X ». Teradata имеет несколько расширений для ANSI SQL. – Andrew