#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;