Присуждение призов на основе процентных соотношений со связями в MySQL

#mysql

#mysql

Вопрос:

Я пытаюсь написать некоторый sql для присвоения значения на основе позиции, и каждая позиция получает определенный процент от общей переменной figure. Могут быть позиционные связи. при наличии связей, например, 3-х сторонней связи для 4-й позиции, все 3 заявки получают равное количество процентов, суммированных для 3-й, 4-й и 5-й позиции. Итак, мне нужно вычислить значение для каждой позиции в этих связях, а затем разделить поровну. Затем следующая позиция получит 6-е место и повторяется до тех пор, пока не будет достигнута последняя позиция.

У меня уже есть функция ранжирования, мне просто нужно отсортировать присвоения значений. Существует установленная сумма для общего распределения, и у меня есть таблица, в которой хранятся все значения для каждой из позиций. Как бы я реализовал это с помощью pro грамматически, предпочтительнее в сочетании php и mysql Большое спасибо за любую помощь.

Комментарии:

1. Можете ли вы абстрагироваться от всего, что касается «призов» и «выплат»? Мы понятия не имеем, что это означает в вашем приложении, и, вероятно, это не имеет значения для рассматриваемой проблемы.

2. Это действительно должно быть в SQL? Это кажется довольно сложным для SQL, но довольно легко программируется практически на любом языке.

3. Большое спасибо, я немного изменил формулировку, надеюсь, к лучшему. Я также изменил требования к языку на предпочтение, но не требование.

Ответ №1:

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;