Sql 从多个范围查找值的最佳方法
我需要确定一个值适合的范围,以便确定适当的折扣。只是想在Access 2016中确定实现这一目标的最佳、最有效的方法。以下是一个简化的表格: 我的第一个想法是循环一个记录集,计算每个记录的>=从$and=<到$and,直到找到一个范围匹配,然后获取折扣率。有没有更有效的方法使用SQL语句执行此操作?我们可以在此处尝试使用: 我们通常希望您的折扣表能够存储多个组的信息,例如产品。在这种情况下,我们可以写:Sql 从多个范围查找值的最佳方法,sql,database,vba,ms-access,Sql,Database,Vba,Ms Access,我需要确定一个值适合的范围,以便确定适当的折扣。只是想在Access 2016中确定实现这一目标的最佳、最有效的方法。以下是一个简化的表格: 我的第一个想法是循环一个记录集,计算每个记录的>=从$and==[From] 并且@Value=d.[从$]的位置?我将测试这些建议并报告。与此同时,我还发现了另一个例子,在这个例子中,你只需要存储一个范围的起始点,这个范围可能有意义,但我很难理解这个概念。我只是想知道这对任何人来说是否有意义。如果你使用“仅起点”的概念,那么你的“发件人”列将看起来像0、
SELECT
product,
MAX(IIF(price BETWEEN FROM$ AND TO$, Discount, NULL)) AS Discount
FROM yourTable
GROUP BY
product;
在您的示例中,无法找到9.999之类的值的折扣。。。它大于9.99,小于10,不适合您的任何范围。我首先将您的数据更改为:
| From | To | Discount |
|------|------|----------|
| 0 | 10 | 0.05 |
| 10 | 20 | 0.10 |
| 20 | 50 | 0.12 |
| 50 | NULL | 0.13 |
然后你可以像这样探测这个表:
选择折扣
打折
其中@Value>=[From]
并且@Value<[To]或[To]为空
假设在这些范围内没有差距,我发现在许多数据库中,最有效的方法是:
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;
请注意,这会忽略到$
特别是,这应该能够利用折扣指数从$,折扣。是否应该在t.[$]>=d.[从$]的位置?我将测试这些建议并报告。与此同时,我还发现了另一个例子,在这个例子中,你只需要存储一个范围的起始点,这个范围可能有意义,但我很难理解这个概念。我只是想知道这对任何人来说是否有意义。如果你使用“仅起点”的概念,那么你的“发件人”列将看起来像0、10、20、50,查询将是“选择前1位折扣”。。。其中@value>=[from]ORDER BY[from]DESC我认为MSACCESS支持TOP n子句以前从未使用过TOP函数。我去查一下,看看我能不能做到。我会回来报到。。。
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;