Sql 根据组中值对的条件选择行
在过去的几天里,我一直在试图解决一个问题,我可以用一个简单的例子很好地解释这个问题: 我有如下表格:Sql 根据组中值对的条件选择行,sql,Sql,在过去的几天里,我一直在试图解决一个问题,我可以用一个简单的例子很好地解释这个问题: 我有如下表格: > Row number ID Value1 Value2 1 1 4 10 --- 2 1 2 9 --- 3 1 3 8 4 1 2 7
> Row number ID Value1 Value2
1 1 4 10 ---
2 1 2 9 ---
3 1 3 8
4 1 2 7
5 1 2 6
6 1 1 5 ---
7 1 1 4
8 1 1 3
9 2 8 21
.
.
.
对于value1 v1和value2 v2,每个ID的行数不相关
我需要的是选择没有其他行满足value1.other_row value2.selected_row条件的行。这必须由一组类似ID进行验证
例如,不应接受第5行,因为查看第4行r4,尽管v1r4=v1r5,但已验证v2r4>v2r5
另一方面,应该接受第6行,因为组ID=1中没有其他行的v1小于或等于其自身的v1,而v2较大
按照这个逻辑,只接受前面有行的行
我曾尝试过自连接,并使用ON子句定义了条件,但不知道如何为组中的每一行测试另一行
有人能帮我实现这个目标吗?
非常感谢。不存在条款在这里似乎很有效:
SELECT t1.*
FROM yourTable t1
WHERE NOT EXISTS (SELECT 1 FROM yourTable t2
WHERE t1.value1 >= t2.value1 AND t1.value2 < t2.value2);
下面是一个具有自连接功能的替代解决方案:
CREATE TABLE #temp (RN INT, ID INT, Value1 INT, Value2 INT)
INSERT INTO #temp
SELECT 1, 1 , 4, 10 UNION ALL -- match
SELECT 2, 1, 2, 9 UNION ALL -- match
SELECT 3, 1, 3, 8 UNION ALL
SELECT 4, 1, 2, 7 UNION ALL
SELECT 5, 1, 2, 6 UNION ALL
SELECT 6, 1, 1, 5 UNION ALL -- match
SELECT 7, 1, 1, 4 UNION ALL
SELECT 8, 1, 1, 3 UNION ALL
SELECT 9, 2, 8, 21
SELECT * FROM #temp WHERE RN NOT IN (
SELECT t1.RN
FROM #temp t1
INNER JOIN #temp t2 on t1.ID=t2.ID and t1.value1 >= t2.value1 AND t1.value2 < t2.value2
)
输出:
如果您根据您一直在尝试的简化示例添加SQL查询,将会有所帮助。非常感谢!