nus/cs2102/labs/tutorials/tut06-ans.sql

79 lines
1.7 KiB
PL/PgSQL

CREATE OR REPLACE FUNCTION max_min(IN stu_id INT, OUT max_cid INT, OUT min_cid INT)
RETURNS RECORD AS
$$
DECLARE
max_score INT;
min_score INT;
BEGIN
SELECT e.score, e.cid
INTO max_score, max_cid
FROM exams e
WHERE stu_id = e.sid
AND e.score = (SELECT MAX(score)
FROM exams
where stu_id = sid);
SELECT e.score, e.cid
INTO min_score, min_cid
FROM exams e
WHERE stu_id = e.sid
AND e.score = (SELECT MIN(score)
FROM exams
where stu_id = sid);
IF max_score = min_score THEN
min_cid = NULL;
END IF;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION revised_avg(IN stu_id INT, OUT r_avg FLOAT)
RETURNS FLOAT AS
$$
DECLARE
max_score INT;
min_score INT;
sum_score FLOAT;
count_score INT;
BEGIN
SELECT MAX(score), MIN(score), SUM(score), COUNT(score)
INTO max_score, min_score, sum_score, count_score
FROM exams
WHERE sid = stu_id;
if count_score < 3 THEN
r_avg := NULL;
ELSE
r_avg := (sum_score - max_score - min_score) / (count_score - 2);
end if;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION list_r_avg()
RETURNS TABLE
(
stu_id INT,
ravg FLOAT
)
AS
$$
DECLARE
curs CURSOR FOR (SELECT sid, score
FROM Exams
ORDER BY sid);
r RECORD;
/* add other variables here */
BEGIN
/* write your code here */
stu_id := -1;
OPEN curs;
LOOP
FETCH curs INTO r;
if r.sid <> "".stu_idOR NOT FOUND THEN
end if;
end loop;
CLOSE curs;
END;
$$ LANGUAGE plpgsql;