RANK OVER 函数的列名无效 SQL
Invalid column name with RANK OVER function SQL
正在尝试创建 table 按产品销售总量和 select 按日期细分的第三大销售产品。不断出错
Invalid Column name
我的 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;
下面的查询将 return 在订单日期级别分区的所有产品 ID 和排名第三的所有订单数量。
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;
可以这样用,where条件下不能用ranking query和same
;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;
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;
正在尝试创建 table 按产品销售总量和 select 按日期细分的第三大销售产品。不断出错
Invalid Column name
我的 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;
下面的查询将 return 在订单日期级别分区的所有产品 ID 和排名第三的所有订单数量。
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;
可以这样用,where条件下不能用ranking query和same
;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;
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;