【问题标题】:Get Nearest Value Within the Range - SQL获取范围内的最近值 - SQL
【发布时间】:2020-05-19 16:03:34
【问题描述】:

使用此表,我需要根据给定的 (+/-) 运行总计获取 DATE 值。

+----+------------+---------+---------------+
| ID |    DATE    | AMOUNT  | RUNNING TOTAL |
+----+------------+---------+---------------+
| 20 | 2020-04-24 | 2941.18 | 2,941.18       |
| 21 | 2020-05-01 | 2941.18 | 5,882.36       |
| 22 | 2020-05-08 | 2941.18 | 8,823.54       |
| 23 | 2020-05-15 | 2941.18 | 11,764.72      |
| 24 | 2020-05-22 | 2941.18 | 14,705.90      |
| 25 | 2020-05-29 | 2941.18 | 17,647.08      |
+----+------------+---------+---------------+

如果运行总计的给定值与表中显示的值完全相同,则很容易。如果给定的运行总数为5, 882.36,则结果为2020-05-01;如果给定的运行总数为14, 75.90,则结果为2020-05-22;等等。

但是,给定的数字与表中存储的数字并不完全相同。例如,

给定的Running Total是8, 600,结果应该是2020-05-08; 对于 14, 000,结果应该是 2020-05-22

我试过这个查询

SELECT TOP 1 DATE FROM Table ORDER BY abs([RunningTotal] - '14000')

它几乎可以正常工作,但如果给定的 Running Total 为 14,706 或者说 15,000,则结果为 2020-05-22 2020-05-29。所需的结果是 2020-05-29,因为它在记录 ID #25 的运行总计内。

【问题讨论】:

  • 我不明白你的情况:8、600,结果应该是2020-05-08; 14, 000,?为什么?它不应该是最近的更大吗?在这种情况下:2020-05-15
  • 首先,去掉14000的引号。
  • 只需过滤以确保差异不是负数。 where running total - 14000 >= 0。然后你也不需要绝对值。事实上,您可以通过总计进行排序。
  • 如果您需要最近更大的,使用ABS() 和区别也是没有意义的。只需按总数计算前 1 个订单,它大于运行总数。
  • 同意。 where running total >= 14000 是一回事。

标签: sql sql-server select


【解决方案1】:

你可以使用过滤和order by:

select top (1) t.*
from t 
where running_total >= @running_total
order by running_total desc

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 2015-12-28
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2011-09-21
    相关资源
    最近更新 更多