我在学习PL SQL而且遇到了障碍......
我希望得到每个TipoAviao上拥有最多nHorasEfectuadas的Tripulante。 (每种飞机类型中具有最多小时数的机组人员的身份)。
我试过了:
SELECT T.IDTRIPULANTE, A.IDTIPOAVIAO, H.NHORASEFETUADAS
FROM TRIPULANTE T, HORASVOO H, TIPOAVIAO A
WHERE T.IDTRIPULANTE=H.IDTRIPULANTE
and H.IDTIPOAVIAO=A.IDTIPOAVIAO
and H.NHORASEFETUADAS = (select distinct max(o.NHORASEFETUADAS)
FROM HORASVOO o
WHERE o.IDTRIPULANTE = T.IDTRIPULANTE)
ORDER BY A.IDTIPOAVIAO;
但是它返回了所有的Tripulantes ......(只有10个)
我做错了什么?
谢谢!
答案 0 :(得分:2)
您可以使用s4
:
ROW_NUMBER
SELECT IDTIPOAVIAO, NHORASEFETUADAS, IDTRIPULANTE
FROM (
SELECT A.IDTIPOAVIAO,
H.NHORASEFETUADAS,
T.IDTRIPULANTE,
ROW_NUMBER() OVER (PARTITION BY A.IDTIPOAVIAO
ORDER BY NHORASEFETUADAS DESC) RN
FROM TIPOAVIAO A
INNER JOIN HORASVOO H
ON H.IDTIPOAVIAO=A.IDTIPOAVIAO
INNER JOIN TRIPULANTE T
ON T.IDTRIPULANTE=H.IDTRIPULANTE) X
WHERE RN = 1
ORDER BY IDTIPOAVIAO;
取代了inner join
子句中的内容,但这种方式确实很老套。 where
是表达表格如何相互关联的ISO标准方式。
join
是一个窗口函数,它为当前记录提供一个数字:它在row_number
子句中定义的记录(分区)子部分中的序列号:具有相同IDTIPOAVIAO值的那些并且以降低NHORASEFETUADAS的顺序。这样你知道得到数字1的那个在该分区中具有最高的NHORASEFETUADAS。
答案 1 :(得分:1)
我希望我能正确理解你:
SELECT A.IDTIPOAVIAO, max(T.IDTRIPULANTE) keep (dense_rank first order by H.NHORASEFETUADAS desc)
FROM TRIPULANTE T join HORASVOO H on T.IDTRIPULANTE=H.IDTRIPULANTE
join TIPOAVIAO A on H.IDTIPOAVIAO=A.IDTIPOAVIAO
group by A.IDTIPOAVIAO
答案 2 :(得分:0)
从IDTIPOAVIAO
和NHORASEFETUADAS
创建临时表或视图。尝试这样的事情:
CREATE TABLE TMP_ID AS
SELECT A.IDTIPOAVIAO AS ID,(SELECT MAX(H.NHORASEFETUADAS) FROM
HORASVOO H WHERE H.IDTIPOAVIAO=A.IDTIPOAVIAO) AS HIGHESTVALUE
FROM TIPOAVIAO A
GROUP BY A.IDTIPOAVIAO
SELECT H.IDTRIPULANTE, T.ID, T.HIGHESTVALUE
FROM HORASVOO H
INNER JOIN TMP_ID T ON (H.IDTIPOAVIAO=T.ID AND H.NHORASEFETUADAS=T.HIGHESTVALUE)