在 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
问题:从下面的 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 |
db