sql - 查询位于另一列的变量 + 或 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 的变量?谢谢。
解决方案
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... 仅取决于您所追求的。但也许我不完全理解这个问题..
推荐阅读
- teamcity - 如何删除 TeamCity 中的所有构建工件?
- swift - Homekit 触发器,如何调用
- spring-mvc - SpringMVC,属性'driverClassName'抛出java.lang.IllegalStateException:无法加载驱动程序类oracle.jdbc.driver.OracleDriver
- java - 如何在 Java SE 中激活自动 JPA 实体验证?
- unity3d - Google Play 游戏未登录(不显示弹出窗口)
- python - Kivy 自定义动画功能
- android - 如何避免 Animator 动画的加速/减速?
- python - 如何将格式化句子数组传递给 Flask 模板?
- javascript - 当用户在地址栏 Angular 上单击输入时检测事件
- php - 在 Laravel 中更新大量条目的最佳方法