2010-05-25 2 views
0

Предположим, у меня есть бюджет в 10 долларов США (любое целое число), и я хочу распространять его по записям, которые имеют поле ранга с различными потребностями. Пример:Распределить бюджет для ранжированных компонентов в SQL

rank  Req. Fulfilled? 
1  $3   Y 
2  $4   Y 
3  $2   Y 
4  $3   N 

Эти разряды от 1 до 3 должны быть выполнены, поскольку они находятся в пределах бюджета. тогда как один рейтинг 4 не должен.

Я хочу, чтобы SQL-запрос решил это.

Ниже мой первоначальный сценарий:

CREATE TABLE budget (
id VARCHAR (32), 
budget INTEGER, 
PRIMARY KEY (id)); 

CREATE TABLE component (
id VARCHAR (32), 
rank INTEGER, 
req INTEGER, 
satisfied BOOLEAN, 
PRIMARY KEY (id)); 

INSERT INTO budget (id,budget) VALUES ('1',10); 
INSERT INTO component (id,rank,req) VALUES ('1',1,3); 
INSERT INTO component (id,rank,req) VALUES ('2',2,4); 
INSERT INTO component (id,rank,req) VALUES ('3',3,2); 
INSERT INTO component (id,rank,req) VALUES ('4',4,3); 

Заранее спасибо за вашу помощь.

Ли

+0

Вы поделились своим DDL, но какие у вас начальные мысли о том, как решить эту проблему? –

+0

Я хотел запустить цикл, вычитая из бюджета на каждой итерации с максимальной функцией, чтобы найти наивысший ранг, но я хотел посмотреть, есть ли чистый запрос SQL, а не процедура. – Lee

ответ

0

Ну, пример вы дали довольно легко:

select rank, req, 
     sum(req) over(order by rank) < (select budget from budget where id = '1') 
      as fulfilled 
from component 

Но это не принимать во внимание:

  • есть 2 единицы, оставшиеся от бюджета которые могут быть распределены на дополнительный компонент с более низким требованием
  • бюджет выделяется компонентам ранжирования, не уверен, что это то, что вы имеете в виду t

Так что если бы существовал компонент (id = 5, rank = 5, req = 2), и это должно быть выполнено, этого недостаточно.

TBH Я подозреваю, что функция выполнения распределения - лучшая ставка - должно быть довольно просто просто выполнить результат запроса, упорядоченного по «раннему возрастанию», и обновить выполненный столбец в соответствии с текущим состоянием.

Смежные вопросы