Недопустимое имя столбца с функцией RANK OVER SQL

Попытка создать таблицу с общим количеством проданных продуктов и выбрать третье по величине количество проданных продуктов, сегментированных по дате. Продолжайте получать ошибку

Недопустимое имя столбца

для псевдонима моего оператора RANK () OVER:

select 
    RANK () OVER (PARTITION BY t3.orderdate order by t3.total_amt_ordered) as ranking,
    t3.productid, 
    t3.orderdate,
    t3.total_amt_ordered
from 
    (select 
         t2.productid,
         t1.orderdate,
         SUM(t2.orderqty) as total_amt_ordered 
     from
         saleslt.salesorderheader t1 
     inner join 
         saleslt.salesorderdetail t2 on t1.salesorderid = t2.salesorderid 
     group by 
         productid, orderdate) t3
where 
    ranking = 3; 

person Cameron Warren    schedule 21.09.2016    source источник
comment
Каковы ваши ожидания?   -  person Teja    schedule 21.09.2016


Ответы (3)


Приведенный ниже запрос вернет все идентификаторы продуктов, разделенные на уровне даты заказа, и все количества заказов, которые оцениваются как три.

SELECT * FROM
     (
        select 
                DENSE_RANK () OVER (PARTITION BY t3.orderdate order by  
                t3.total_amt_ordered DESC ) as ranking,
                t3.productid, 
                t3.orderdate,
                t3.total_amt_ordered
          from ( 
                 select 
                         t2.productid,
                         t1.orderdate,
                         SUM(t2.orderqty) as total_amt_ordered 
                   from
                         saleslt.salesorderheader t1 
                     inner join
                         saleslt.salesorderdetail t2 
                     on t1.salesorderid=t2.salesorderid 
                   group by productid, orderdate) t3
      ) Z
where Z.ranking= 3; 
person Teja    schedule 21.09.2016
comment
Спасибо! Получение ошибки в операторе where. Можно не включать? - person Cameron Warren; 21.09.2016
comment
Какую ошибку вы получаете? А также работает ли мой запрос без предложения where? Если да, то какие последние столбцы в выводе вы видите...? - person Teja; 21.09.2016
comment
Это не работает без предложения where. Отображается: сообщение 102, уровень 15, состояние 1, строка 48. Неправильный синтаксис рядом с ';'. - person Cameron Warren; 21.09.2016
comment
Можете ли вы попробовать запустить большинство внутренних запросов и посмотреть, как будут получены результаты... - person Teja; 21.09.2016
comment
Вам нужно добавить псевдоним для Derived Table, т.е. перед окончательным WHERE - person dnoeth; 21.09.2016
comment
Итак, этот код работает, за исключением того, что он дает мне результаты только для одной из дат (таблица содержит две даты заказа 6-04 и 6-05 - дает мне результаты только для 6-04, но это правильно для 6-04) - person Cameron Warren; 22.09.2016
comment
118 значений для 6-04 и 135 для 6-05 - person Cameron Warren; 22.09.2016
comment
Есть ли дубликаты в вашем упорядоченном значении в разделе уровня даты... ?? Если это так, то вы должны использовать плотный ранг вместо ранга... - person Teja; 22.09.2016
comment
DENSE_RANK сделал свое дело. Странно только то, что я получаю 4-е и 5-е самое высокое значение для 6-05 (они оба одинаковые), но 6-04 правильно. По какой-то причине я бы получил 4-е значение вместо третьего (второе и третье значения также связаны, так что, возможно, дело в этом.) - person Cameron Warren; 22.09.2016
comment
Да, если есть n значений, которые совпадают, то следующему значению будет присвоен ранг, который на n меньше, чем ранг, присвоенный связанному значению. Эту проблему можно решить, используя плотный ранг, поскольку все ранги последовательны. - person Teja; 22.09.2016

WHERE оценивается перед RANK, поэтому вы не можете использовать его напрямую без Derived Table/CTE, но он также вычисляется после SUM, что приводит к следующему запросу:

select *
from 
  (  select 
         t2.productid,
         t1.orderdate,
         SUM(t2.orderqty) as total_amt_ordered,
         RANK ()
         OVER (PARTITION BY t1.orderdate
               order by SUM(t2.orderqty)) as ranking
     from
         saleslt.salesorderheader t1 
     inner join 
         saleslt.salesorderdetail t2 on t1.salesorderid = t2.salesorderid 
     group by 
         productid, orderdate
  ) t3
where 
    ranking = 3; 
person dnoeth    schedule 21.09.2016
comment
Это дает мне нули. - person Cameron Warren; 22.09.2016
comment
@CameronWarren: НУЛИ? Вероятно, вам нужно переключиться на DENSE_RANK (или, может быть, на ROW_NUMBER) - person dnoeth; 22.09.2016

Вы можете использовать этот способ, вы не можете использовать ранжирующий запрос и то же самое в условии где

;WITH cte
AS (SELECT
    RANK() OVER (PARTITION BY t3.orderdate ORDER BY t3.total_amt_ordered) AS ranking,
    t3.productid,
    t3.orderdate,
    t3.total_amt_ordered
FROM (SELECT
    t2.productid,
    t1.orderdate,
    SUM(t2.orderqty) AS total_amt_ordered
FROM saleslt.salesorderheader t1
INNER JOIN saleslt.salesorderdetail t2
    ON t1.salesorderid = t2.salesorderid
GROUP BY    productid,
            orderdate) t3)
SELECT
    *
FROM cte
WHERE ranking = 3;
person Kannan Kandasamy    schedule 21.09.2016
comment
Это дает все нули. - person Cameron Warren; 22.09.2016