Лучший способ поиска значения из нескольких диапазонов - PullRequest
0 голосов
/ 08 ноября 2018

Мне нужно определить, к какому диапазону подходит значение, чтобы определить соответствующую скидку.Просто пытаюсь определить лучший и самый эффективный способ сделать это в Access (2016).Вот упрощенная таблица:

enter image description here

Моей первой мыслью является циклический просмотр набора записей для оценки каждой записи для> = FROM $ и =

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

В вашем примере невозможно найти скидку для такого значения, как 9.999 ... оно больше 9,99 и меньше 10 и не помещается ни в одно из ваши диапазоны. Я бы начал с изменения ваших данных на:

| From | To   | Discount |
|------|------|----------|
| 0    | 10   | 0.05     |
| 10   | 20   | 0.10     |
| 20   | 50   | 0.12     |
| 50   | NULL | 0.13     |

И тогда вы можете исследовать стол следующим образом:

SELECT Discount 
FROM   Discounts
WHERE  (@Value >= [From])
AND    (@Value <  [To] OR [To] IS NULL)
0 голосов
/ 08 ноября 2018

Если у вас нет пропусков в диапазонах, я считаю, что во многих базах данных самый эффективный метод:

select t.*,
       (select top 1 d.discount
        from discounts d
        where t.[$] <= d.[from$]  -- the $ is for whatever column name you actually use
        order by d.[from$] desc
       ) as discount
from t;

(Обратите внимание, что игнорируется to$.)

В частности, это должно быть в состоянии использовать индекс на discounts(from$, discount).

0 голосов
/ 08 ноября 2018

Мы можем попробовать использовать BETWEEN здесь:

SELECT
    MAX(IIF(price BETWEEN FROM$ AND TO$, Discount, NULL)) AS Discount
FROM yourTable;

Мы можем ожидать, что ваша таблица скидок будет хранить информацию для нескольких групп, например, товары. В этом случае мы могли бы написать:

SELECT
    product,
    MAX(IIF(price BETWEEN FROM$ AND TO$, Discount, NULL)) AS Discount
FROM yourTable
GROUP BY
    product;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...