My question is -> Retrieve the segment ID and length of each segment that is longer than the average length of all segments. Name the column indicating the length of segments “Length”.
Relations:
x
Highway(code, name, startNodeId,endNodeId)
Segment (code, segId, fromKM, toKM)
City(ZIP,Name)
Node (nodeID, longitude, latitude, type)
Exit(nodeId, exitNo, ZIP)
Intersection(nodeId,name)
HighwayIntersection(code, nodeId,atKm)
HighwayExit(code, nodeId, atKm)
What I got so far is:
SELECT code, segid, fromkm, tokm, tokm - fromkm AS Length
from segment
GROUP BY segid, tokm-fromkm
HAVING AVG( tokm - fromkm) < tokm - fromkm
And I got this error message:
Error: Your query has syntax errors. Description: java.sql.SQLException: ORA-00979: not a GROUP BY expression
Can anyone say what’s exactly wrong ?
Advertisement
Answer
You can use window functions to achieve this:
SELECT code, segid, fromkm, tokm, length
FROM
(
SELECT code, segid, fromkm, tokm, tokm - fromkm AS Length, AVG(tokm - fromkm) OVER () as AverageLength
from segment
) seg
WHERE AverageLength < Length