X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.2]) by svr1.postgresql.org (Postfix) with ESMTP id 8AB3FD1D621 for ; Sat, 10 Apr 2004 11:35:36 -0300 (ADT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (neptune.hub.org [200.46.204.2]) (amavisd-new, port 10024) with ESMTP id 13566-05 for ; Sat, 10 Apr 2004 11:35:38 -0300 (ADT) Received: from biglumber.com (biglumber.com [207.228.252.42]) by svr1.postgresql.org (Postfix) with SMTP id C8C38D1D09E for ; Sat, 10 Apr 2004 11:35:33 -0300 (ADT) Received: (qmail 14572 invoked from network); 10 Apr 2004 14:35:38 -0000 Received: from unknown (HELO localhost) (207.228.252.42) by 0 with SMTP; 10 Apr 2004 14:35:38 -0000 From: "Greg Sabino Mullane" To: pgsql-sql@postgresql.org Subject: Re: SQL challenge--top 10 for each key value? X-PGP-Key: 2529 DF6A B8F7 9407 E944 45B4 BC9B 9067 1496 4AC8 X-Request-PGP: http://www.biglumber.com/x/web?pk=2529DF6AB8F79407E94445B4BC9B906714964AC8 In-Reply-To: <33af4fa4e4ec230574cefcff737ea40a@news.teranews.com> Date: Sat, 10 Apr 2004 14:35:38 -0000 X-Mailer: JoyMail 1.47 Message-ID: X-Virus-Scanned: by amavisd-new at postgresql.org X-Archive-Number: 200404/89 X-Sequence-Number: 17464 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 > How would you go about getting the top N (say, the top 10) for each query? Assume you have a table "ch" and three sequences 'aa', 'bb', and 'cc'. (Only 'aa' and 'bb' need to be initially set) SELECT setval('aa',1,'f'); SELECT setval('bb',1,'f'); SELECT nextval('cc') AS rating,q2 AS query, s2 AS score FROM ( SELECT 0 AS q1, 0 AS s1, NULL AS cs, nextval('aa') AS v1 UNION ALL (SELECT *, nextval('aa') AS v1 FROM (SELECT query AS q1, MAX(score) AS s1, checksum AS cs FROM ch GROUP BY 1,3 ORDER BY 1 ASC, 2 DESC) AS foo) ) AS uno, ( (SELECT *, nextval('bb') AS v2 FROM (SELECT query AS q2, MAX(score) AS s2, checksum AS cs FROM ch GROUP BY 1,3 ORDER BY 1 ASC, 2 DESC) AS foo) UNION ALL SELECT NULL AS q2, 0 AS s2, NULL AS cs, nextval('bb') AS v2 ) AS dos WHERE v1 = v2 AND q2 IS NOT NULL AND ( (CASE WHEN q1 != q2 THEN setval('cc',1,'f') ELSE 0 END > 0) OR (CASE WHEN currval('cc')<10 THEN 1 ELSE 0 END >0) ); - -- Greg Sabino Mullane greg@turnstep.com PGP Key: 0x14964AC8 200404101029 -----BEGIN PGP SIGNATURE----- iD8DBQFAeAZ1vJuQZxSWSsgRAqYuAJ9HaYLotPYkyi1U76I9xnvi8AhLTQCfUyJq +iVdbz5U7HKep89z0kp49U0= =6+OH -----END PGP SIGNATURE-----