我有一张桌子col,我有:
select * from offc.col;

我使用按年查询ans dept_id wise返回了一些数据:
SELECT dept_id,
year,
Max(marks) marks
FROM offc.col
GROUP BY dept_id,
year
ORDER BY dept_id,
year 我得到的数据是:

这里没有问题,因为我的sql正在运行right.So,我需要提取col表的所有信息,所以我将子查询用作:
SELECT *
FROM offc.col
WHERE ( dept_id, year, marks ) IN (SELECT dept_id,
year,
Max(marks) marks
FROM offc.col
GROUP BY dept_id,
year
ORDER BY dept_id,
year); 但是,我犯了错误,因为:
ORA-00920: invalid relational operator 我也在其他页面搜索了这个错误,但是在我的例子中,我发现这些错误作为error.But的括号错了,我不知道这里发生了什么?
发布于 2019-10-20 14:20:41
您可以使用关联子查询进行筛选,而不是聚合:
select c.*
from offc.col c
where marks = (
select max(marks)
from offc.col c1
where c1.dept_id = c.dept_id and c1.year = c.year
)
order by dept_id, year (dept_id, year, marks)上的索引将加快此查询的速度。
另一个选项是使用窗口函数row_number()。
select *
from (
select
c.*,
row_number() over(partition by dept_id, year order by marks desc) rn
from offc.col c
) x
where rn = 1
order by dept_id, year 如果您确实希望坚持聚合,那么您可以将您的子查询与原始表连接,如下所示:
select c.*
from offc.col c
inner join (
select dept_id, year, max(marks) marks
from offc.col
group by dept_id, year
) m
on m.dpt_id = c.dept_id
and m.year = c.year
and m.marks = m.marks发布于 2019-10-20 14:28:34
我建议使用dense_rank分析函数,因为如果两个部门在同一年有相同的分数,它们可以返回(您当前的逻辑与此相同)。
Row_number只会给你一个随机记录,如果两个部门在同一年有相同的分数。
select *
from (
select
c.*,
dense_rank() over(partition by dept_id, year order by marks desc nulls last) as dr
from offc.col c
) x
where dr = 1
order by dept_id, year 另外,您的查询是正确的,只需从其中移除顺序即可。
SELECT *
FROM offc.col
WHERE ( dept_id, year, marks ) IN (SELECT dept_id,
year,
Max(marks) marks
FROM offc.col
GROUP BY dept_id,
year
-- ORDER BY dept_id,
-- year
); 演示的错误与order by和工作良好,没有order by。
干杯!!
发布于 2019-10-20 16:52:22
使用子查询执行内部连接:
SELECT c.*
FROM offc.col c
INNER JOIN (SELECT dept_id,
year,
Max(marks) AS MAX_MARK
FROM offc.col
GROUP BY dept_id,
year) s
ON s.DEPT_ID = c.DEPT_ID AND
s.YEAR = c.YEAR AND
s.MAX_MARK = c.MARKS
ORDER BY c.DEPT_ID, c.YEAR内部联接只返回满足联接条件的行,因此OFFC.COL中没有特定DEPT_ID和年份标记最大值的任何行都不会被返回。
https://stackoverflow.com/questions/58473905
复制相似问题