0

私はそのように見える金額と金利を格納するテーブルを持っています。これらは事実上、私が構築している単純なシステムでのローンの貸し付けのビッドまたはオファーです。1000000 ポンドのローンがある場合、このローンに対して複数のオファー/ビッドが存在する可能性があります。

これらの入札を最高の利率でソートする必要があります。これは可能です。しかし、どの入札が受け入れられるかを追跡するために現在の合計を記録することはできません。

これが私が持っているテーブルです。

+-----+--------+---------------+------------+
| id  | amount | interest_rate | aggregated |
+-----+--------+---------------+------------+
| 105 | 100000 | 5             |     100000 |
| 108 | 500000 | 6.75          |     600000 |
| 107 |  50000 | 7             |     650000 |
| 106 | 100000 | 8             |     750000 |
| 112 | 500000 | 8.75          |    1250000 |
| 111 |   5000 | 16            |    1255000 |
| 110 | 500000 | 20            |    1755000 |
+-----+--------+---------------+------------+

ここで、集計された列を取得できたことがわかります。ただし、£1000000 を下回るすべての入札を取得する必要があります。つまり、集計列を使用すると、上位 4 つだけが返されます。

より良いアイデアを提供するために、ここに、私が必要とする望ましい結果が返された表をもう一度示します。

+-----+--------+---------------+------------+--------+--------+
| id  | amount | interest_rate | aggregated | wanted | total  |
+-----+--------+---------------+------------+--------+--------+
| 105 | 100000 | 5             |     100000 | *      | 100000 |
| 108 | 500000 | 6.75          |     600000 | *      | 600000 |
| 107 |  50000 | 7             |     650000 | *      | 650000 |
| 106 | 100000 | 8             |     750000 | *      | 750000 |
| 112 | 500000 | 8.75          |    1250000 |        | 750000 |
| 111 |   5000 | 16            |    1255000 | *      | 755000 |
| 110 | 500000 | 20            |    1755000 |        | 755000 |
+-----+--------+---------------+------------+--------+--------+

基本的に、1000000 未満に収まる Interest_rate でソートされたすべての行を選択したいと考えています。ここで、750000 + 1250000 > 1000000 であるため、行 112 をスキップしたことがわかります。したがって、それをスキップして先に進みます。

これらの結果を返すために現在使用している単純な SQL を次に示します。

SET @aggregated = 0;
SET @position = 0;
SELECT id, amount, interest_rate, aggregated FROM (
    SELECT 
        *,
        @aggregated := @aggregated + `auction_bids`.`amount` as `aggregated`,
        @position := @position + 1 as `position`        
    FROM 
        `auction_bids` 
    WHERE 
        `auction_bids`.`auction_id` = 21 AND
        `auction_bids`.`amount` < 1000000
    ORDER BY 
        `auction_bids`.`interest_rate` ASC
) as `a`;
4

1 に答える 1

0

これは役立つかもしれませんが、SQLFiddle のネストされたクエリで使用しようとするとうまくいきません。

set @aggregated := 0;
set @position := 0;
set @inc := 0;

select
    *,
    @aggregated := @aggregated + `auction_bids`.`amount` as `aggregated`,
    @position := @position + 1 as `position`,
    case 
        when @inc + `auction_bids`.`amount` <= 1000000 then 1
        else 0 
    end as `wanted`,
    @inc := @inc + case 
        when @inc + `auction_bids`.`amount` > 1000000 then 0 
        else `auction_bids`.`amount` 
    end as `includedaggregate`
from
    `auction_bids` 
where 
    `auction_bids`.`auction_id` = 21 and
    `auction_bids`.`amount` < 1000000
order by
    `auction_bids`.`interest_rate`

Example SQLFiddle

于 2013-10-27T21:35:37.487 に答える