首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于输入范围和现有数据检索多个变量的SQL查询

基于输入范围和现有数据检索多个变量的SQL查询
EN

Stack Overflow用户
提问于 2019-02-07 19:58:42
回答 1查看 35关注 0票数 1

我有一个数据集,我正在尝试查询以获得折扣率。挑战在于,数据集仅保留可能的查询输入的子集的折扣。

在某些情况下,我可以从数据中获得准确的折扣率。在其他情况下,我需要获得最接近的匹配项(更高和更低),然后从返回的数据外部计算折扣。

考虑如下所示的虚拟数据集:

如果我有一个完全匹配的,那么就很容易计算出折扣。例如,如果频率为5,持续时间或2个订单数量为50,则折扣为0.10402。

但是,如果频率是7,持续时间是6,顺序是50,我需要能够返回下一个最低和下一个最高匹配行,然后独立计算实际折扣。例如:希望检索以下内容:

次低(例如:频率5) = 0.10402次高(例如:频率10) = 0.31048

最后,如果我没有精确的匹配频率和持续时间,我需要4个结果来独立计算折扣!例如:

以下项目的折扣率:

(低/低)小于的最近频率&小于的最近持续时间

(低/高)小于的最近频率&大于的最近持续时间

(高/低)大于的最近频率和小于的最近持续时间

(高/高)大于的最近频率和大于的最近持续时间

因此,我认为我需要一个查询,它将返回1到4行,这取决于提供的输入以及它们与数据的匹配程度。具体地说:

如果在频率和持续时间上存在精确匹配,则为一行。

如果(比方说) Freq完全匹配,则两行。第一行将是下一个最低持续时间的rates,第二个是下一个最高持续时间的rates。

如果没有完全匹配的行,则为四行,例如:

第一行)最近的较低频率和最近的较低持续时间

第二行)最近的较低频率和最近的较高持续时间

第3行)最近的较高频率和最近的较低持续时间

第4行)最近的较高频率和最近的较高持续时间

希望这是有意义的!有没有人有任何建议,关于如何编写一个可以实现相同功能的查询?我尝试过很多不同的方法,但都纠结于其中!

谢谢!

这是一个示例查询,我今天可以运行它来获取精确匹配结果!

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-07 20:03:04

最简单的方法可能是union

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54572868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档