Оператор SQL SELECT, содержащий AS - PullRequest
2 голосов
/ 14 января 2011

У меня есть запрос SQL:

select title, scale / next_scale, c
from ( select title, scale, scale*D0 AS c, 
              lead(scale) over(partition by title order by scale asc) as next_scale,
              row_number() over(partition by title order by scale asc) as agg_row
       from signatures
     ) agg
where agg_row = 1;

и работает как положено. Однако то, что я действительно хочу, чтобы значение «масштабирования» сортировки было арифметической операцией между несколькими столбцами, поэтому я попытался использовать предложение AS (показано выше) и изменить запрос следующим образом:

select title, scale / next_scale, c
from ( select title, scale, scale*D0 AS c, 
              lead(scale) over(partition by title order by c asc) as next_scale,
              row_number() over(partition by title order by c asc) as agg_row
       from signatures
     ) agg
where agg_row = 1;

Однако, это не удается на ORDER BY c. Почему это? Я могу заменить ORDER BY scale*D0, и он работает просто отлично. Тем не менее, я в конечном итоге захочу использовать такой термин, как: scale*D0*D1*D2*...*D100; и я не хочу рассчитывать это 3 разных раза - не говоря уже о физической длине запроса. Я надеюсь получить scale*D0*D1*D2*...*D100 AS c, а затем ORDER BY c.

Возможно ли это?

Я использую PostgreSQL.

Большое спасибо, Brett

Ответы [ 3 ]

3 голосов
/ 14 января 2011

Рассчитать c в подзапросе:

select title, scale / next_scale, c
from ( select title, scale, c, 
              lead(scale) over(partition by title order by c asc) as next_scale,
              row_number() over(partition by title order by c asc) as agg_row
       from (select title, scale, scale * D0 AS c from signatures) signatures_calc
     ) agg
where agg_row = 1;
1 голос
/ 14 января 2011

Вы можете ЗАКАЗАТЬ ПО порядковому номеру столбца:

select title, scale / next_scale, c
from ( select title, scale, scale*D0 AS c, 
          lead(scale) over(partition by title order by scale asc) as next_scale,
          row_number() over(partition by title order by scale asc) as agg_row
   from signatures
 ) agg
where agg_row = 1
order by 3;
0 голосов
/ 14 января 2011

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

select title, scale / next_scale, c
from ( select title, scale, scale*D0 AS c, 
          lead(scale) over(partition by title order by scale asc) as next_scale,
          row_number() over(partition by title order by scale asc) as agg_row
       from signatures
       order by 3
 ) agg
where agg_row = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...