Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据组中值对的条件选择行_Sql - Fatal编程技术网

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查询,将会有所帮助。非常感谢!