我有一个数据集,我正在尝试查询以获得折扣率。挑战在于,数据集仅保留可能的查询输入的子集的折扣。
在某些情况下,我可以从数据中获得准确的折扣率。在其他情况下,我需要获得最接近的匹配项(更高和更低),然后从返回的数据外部计算折扣。
考虑如下所示的虚拟数据集:

如果我有一个完全匹配的,那么就很容易计算出折扣。例如,如果频率为5,持续时间或2个订单数量为50,则折扣为0.10402。
但是,如果频率是7,持续时间是6,顺序是50,我需要能够返回下一个最低和下一个最高匹配行,然后独立计算实际折扣。例如:希望检索以下内容:
次低(例如:频率5) = 0.10402次高(例如:频率10) = 0.31048
最后,如果我没有精确的匹配频率和持续时间,我需要4个结果来独立计算折扣!例如:
以下项目的折扣率:
(低/低)小于的最近频率&小于的最近持续时间
(低/高)小于的最近频率&大于的最近持续时间
(高/低)大于的最近频率和小于的最近持续时间
(高/高)大于的最近频率和大于的最近持续时间
因此,我认为我需要一个查询,它将返回1到4行,这取决于提供的输入以及它们与数据的匹配程度。具体地说:
如果在频率和持续时间上存在精确匹配,则为一行。
如果(比方说) Freq完全匹配,则两行。第一行将是下一个最低持续时间的rates,第二个是下一个最高持续时间的rates。
如果没有完全匹配的行,则为四行,例如:
第一行)最近的较低频率和最近的较低持续时间
第二行)最近的较低频率和最近的较高持续时间
第3行)最近的较高频率和最近的较低持续时间
第4行)最近的较高频率和最近的较高持续时间
希望这是有意义的!有没有人有任何建议,关于如何编写一个可以实现相同功能的查询?我尝试过很多不同的方法,但都纠结于其中!
谢谢!
这是一个示例查询,我今天可以运行它来获取精确匹配结果!
select Rate from RateTable
where ProductId=34343
and ProductVariationCode='G497'
and ProductStatus=0
and Frequency=23
and Duration=4
and 100 >= MinOrder
and 100 < MinOrder发布于 2019-02-07 20:03:04
最简单的方法可能是union
select . . . -- your logic combining the values
from ((select top (1) t.*
from t
where frequency <= @frequency and duration <= @duration and
@order between minorder and maxorder
order by frequency desc, duration desc
) union -- on purpose to remove duplicates
(select top (1) t.*
from t
where frequency >= @frequency and duration <= @duration and
@order between minorder and maxorder
order by frequency asc, duration desc
) union -- on purpose to remove duplicates
(select top (1) t.*
from t
where frequency <= @frequency and duration >= @duration and
@order between minorder and maxorder
order by frequency desc, duration asc
) union -- on purpose to remove duplicates
(select top (1) t.*
from t
where frequency >= @frequency and duration >= @duration and
@order between minorder and maxorder
order by frequency asc, duration asc
)
) t;https://stackoverflow.com/questions/54572868
复制相似问题