在 Oracle SQL 中使用 CTE(ORA-00923:未在预期位置找到 FROM 关键字)

Using CTE in Oracle SQL (ORA-00923: FROM keyword not found where expected)

问题:从下面的 table 包含日期和订购商品的列表中,写一个查询 return 每个日期订购最频繁的商品。 Return 多件平局。

在 Oracle 中输入问题 SQL

create table items(dates varchar2(200), item VARCHAR2(200));

insert into items values ('01-01-20', 'apple');
insert into items values ('01-01-20', 'apple');
insert into items values ('01-01-20', 'pear');
insert into items values ('01-01-20', 'pear');
insert into items values ('01-02-20', 'pear');
insert into items values ('01-02-20', 'pear');
insert into items values ('01-02-20', 'pear');
insert into items values ('01-02-20', 'orange');

这是我要执行的代码。但是,我得到一个错误

ORA-00923: FROM keyword not found where expected

有人可以帮忙吗?

select dates, item
from 
(
SELECT *, rank() OVER (PARTITION by dates ORDER BY item_count DESC) AS date_rank
FROM 
(
SELECT dates, item, count(*) AS item_count
FROM items
GROUP BY 1, 2
ORDER BY 1))
where date_rank=1;

我已将子查询中的 * 替换为 dates, items,并将 group by 子句从 group by 1,2 更改为 group by dates, items。有效。

但我建议使用查询#2,在我看来它更具可读性并且将来更容易更改。

 create table items(dates varchar2(200), item VARCHAR2(200));

 insert into items values ('01-01-20', 'apple');

 insert into items values ('01-01-20', 'apple');

 insert into items values ('01-01-20', 'pear');

 insert into items values ('01-01-20', 'pear');

 insert into items values ('01-02-20', 'pear');

 insert into items values ('01-02-20', 'pear');

 insert into items values ('01-02-20', 'pear');

 insert into items values ('01-02-20', 'orange');

查询#1:

select dates, item
     from 
     (
     SELECT dates,item, rank() OVER (PARTITION by dates ORDER BY item_count DESC) AS date_rank
     FROM 
     (
     SELECT dates, item, count(*) AS item_count
     FROM items
     GROUP BY dates, item
     ORDER BY dates) ) 
     where date_rank=1;

输出:

DATES ITEM
01-01-20 apple
01-01-20 pear
01-02-20 pear

查询#2:

 with cte (dates,item,date_rank) as
 (  
    SELECT dates, item,rank() OVER (PARTITION by dates ORDER BY count(*) DESC)  AS date_rank
    FROM items
    GROUP BY dates, item
    ORDER BY dates
 )
 select  dates,item from cte 
 where date_rank=1;

输出:

DATES ITEM
01-01-20 apple
01-01-20 pear
01-02-20 pear

dbhere