首页 > 解决方案 > 查询位于另一列的变量 + 或 1 内的列

问题描述

我有一个有 2 列的表,我正在尝试确定一种方法来选择两列彼此接近的记录。如果我能考虑如何做到这一点,也许基于标准偏差。但就目前而言,这就是我的桌子的样子:

ID| PCT | RETURN
1 | 20  |  1.20
2 | 15  |  0.90
3 | 0   |  3.00

pct 字段中的值是百分比数字(例如 20%)。返回字段中的值是一个未完全计算的百分比数字(因此它应该比初始值高 20%)。到目前为止,我正在使用的查询是:

select * from TABLE1 where ((pct = ((return - 1)* 100)));

我想要结束的是两者都在彼此的设定值内的行。例如,如果它们彼此相距在 5 个点以内,则将返回该行并且输出将是:

ID| PCT | RETURN
1 | 20  |  1.20
2 | 15  |  0.90

在上面,ID 1 应该是 PCT = 20 和 Return = 20,而 ID 2 是 PCT = 15 和 RETURN = 10。因为它彼此相差 5 个点以内,所以它被返回。

ID 3 未返回,因为 0 和 200 远高于 5 点阈值。

在比较上述属性的两个值时,有什么方法可以设置一个返回 +- 5 的变量?谢谢。

标签: sqloracle

解决方案


RexTester示例:

使用 Lead() over (Order by PCT) 向前看, LAG() 向后看下一行做数学运算并评估结果......

WITH CTE (ID, PCT , RETURN) as (
SELECT 1 , 20  ,  1.20 FROM DUAL UNION ALL
SELECT 2 , 15  ,  0.90 FROM DUAL UNION ALL
SELECT 3 , 0   ,  3.00 FROM DUAL),
CTE2 as (SELECT A.*, LEAD(PCT) Over (ORDER BY PCT) LEADPCT, LAG(PCT) Over (order by PCT) LAGPCT
         FROM CTE A)

SELECT * FROM CTE2
WHERE LEADPCT-PCT <=5 OR PCT-LAGPCT <=5
Order by ID

给我们:

+----+----+-----+--------+---------+--------+
|    | ID | PCT | RETURN | LEADPCT | LAGPCT |
+----+----+-----+--------+---------+--------+
|  1 |  1 |  20 |   1,20 | NULL    |     15 |
|  2 |  2 |  15 |   0,90 | 20      |      0 |
+----+----+-----+--------+---------+--------+

或使用返回值而不是 PCT... 仅取决于您所追求的。但也许我不完全理解这个问题..


推荐阅读