根据条件为组

时间:2019-06-27 14:53:02

标签: sql

在过去的几天里,我一直在尝试解决一个问题,我可以用一个简单的例子很好地解释它:

我有一个如下表格:

> 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        
            .
            .
            .

每个ID的值1(v1)和value2(v2)的行数都不相关。

我需要选择没有满足value1.other_row <= value1.selected_row 条件的其他行的行  value2.other_row> value2.selected_row。必须通过一组类似的ID进行验证。

例如,不应该接受第5行,因为查看第4行(r4),尽管v1(r4)= v1(r5),但可以验证v2(r4)> v2(r5)。

另一方面,应该看到第6行,因为组ID = 1中没有其他行具有小于或等于其自身的v1,而具有更大的v2!

按照此逻辑,仅应接受前面带有-的行。

我尝试了自我JOIN,并使用ON子句定义了条件,但无法理解如何为每隔一行测试组中的每一行

有人可以帮助我实现这一目标吗? 非常感谢。

2 个答案:

答案 0 :(得分:1)

<!DOCTYPE html> <html> <head runat="server"> <title>Choose language to upload .html files</title> </head> <body> <form"> <div> <h1>Choose language to upload .html files</h1> <select> /*After page is loaded, method from a controller will add options*/ </select> </div> <button>Start</button> /*Another method from a controller will be bound to this button*/ </form> </body> </html> 子句在这里似乎很好地工作:

NOT EXISTS

enter image description here

Demo

答案 1 :(得分:0)

这是自连接的替代解决方案:

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
)

输出:

enter image description here