Motivation
SELECT DISTINCT c1, c2 FROM t ORDER BY c3
SQL0214N An expression in the ORDER BY clause in the following position, or starting with " C3" in the " ORDER BY" clause is not valid. Reason code = " 2" .
Guestbook
Who are the guests I haven't seen for the longest time?
CREATE TABLE guests(name VARCHAR(20), firstname VARCHAR(20), visit DATE); INSERT INTO guests VALUES ('Jones' , 'Jeremy' , '2012-04-13'), ('Beaver' , 'Boris' , '2012-04-14'), ('Gervais' , 'Gerald' , '2012-04-13'), ('Jones' , 'Jeremy' , '2012-04-15'), ('Beaver' , 'Boris' , '2012-04-15'), ('Chambers', 'Charlene', '2012-04-15'), ('Dreyfus' , 'Don' , '2012-04-14'), ('Jones' , 'Jeremy' , '2012-04-14'), ('Eakes' , 'Edwin' , '2012-04-14'), ('Fox' , 'Frauke' , '2012-04-14'), ('Dreyfus' , 'Don' , '2012-04-13');
SELECT name, firstname FROM guests ORDER BY visit; NAME FIRSTNAME ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- Jones Jeremy Gervais Gerald Dreyfus Don Beaver Boris Dreyfus Don Jones Jeremy Eakes Edwin Fox Frauke Jones Jeremy Beaver Boris Chambers Charlene 11 rows were retrieved.
SELECT DISTINCT name, firstname FROM guests ORDER BY visit; SQL0214N An expression in the ORDER BY clause in the following position, or starting with " VISIT" in the " ORDER BY" clause is not valid. Reason code = " 2" .
SELECT DISTINCT name, firstname FROM (SELECT name, firstname FROM guests ORDER BY visit); NAME FIRSTNAME ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- Beaver Boris Chambers Charlene Dreyfus Don Eakes Edwin Fox Frauke Gervais Gerald Jones Jeremy 7 rows were retrieved.
Going old school
SELECT name, firstname FROM guests g WHERE visit IN (SELECT MAX(visit) FROM guests WHERE g.name = guests.name AND g.firstname = guests.firstname) ORDER BY visit; NAME FIRSTNAME ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- Gervais Gerald Dreyfus Don Eakes Edwin Fox Frauke Jones Jeremy Beaver Boris Chambers Charlene 7 rows were retrieved.
OLAP to the rescue
SELECT name, firstname FROM(SELECT ROW_NUMBER() OVER(PARTITION BY name, firstname ORDER BY visit DESC) AS rn, name, firstname, visit FROM guests) WHERE rn = 1 ORDER BY visit; NAME FIRSTNAME ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- Gervais Gerald Dreyfus Don Eakes Edwin Fox Frauke Beaver Boris Chambers Charlene Jones Jeremy 7 rows were retrieved.
No comments:
Post a Comment