MySQL不会做窗口功能,所以这变得毛茸茸。
CREATE TABLE scores (score real);
CREATE TABLE prizes (prize real); /* in any order but assumed distinct, minor changes otherwise */
CREATE VIEW ranked_scores AS
SELECT s.score,
1+COUNT(s2.score > s.score) AS best_place,
-1+COUNT(s2.score=s.score) AS n_tied_with
FROM score s JOIN score s2 ON s2.score>=s.score;
/* if prizes can be the same we need something more like the view above */
CREATE VIEW ranked_prizes AS
SELECT p.prize, COUNT(p2.prize) AS prize_rank
FROM prize p JOIN prize p2 ON p.prize<=p2.prize;
/* there are more efficient ways of getting those ranks except I don't know
* MySQL syntax for getting a pseudo-table 1..n, and windowing functions
* are not available IFAIK.*/
SELECT score, avg(prize) FROM ranked_scores JOIN ranked_prizes
ON prize_rank between best_place and best_place+n_tied_with;
你能抽象出所有关于“奖品”和“支出”的东西吗?我们不知道您的应用程序中的含义,对于手头的问题可能并不重要。 – 2011-04-24 21:12:17
它真的必须在SQL中吗?这对于SQL来说看起来相当复杂,但几乎可以用任何语言编程。 – Halcyon 2011-04-24 21:45:49
非常感谢,迄今为止,我已经对它进行了一些改编,希望能够更好。我也将语言要求更改为偏好,但不是要求。 – 2011-04-25 01:45:44