簡體   English   中英

根據條件為組中的值對選擇行

[英]Selecting rows based on condition for value pairs in group

在過去的幾天里,我一直在嘗試解決一個問題,我可以通過一個簡單的例子來很好地解釋這個問題:

我有如下表格:

> 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)和值2(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子句定義條件的方法,但無法理解如何為每隔一行測試組中的每一行

有人可以幫助我實現這個目標嗎? 非常感謝你。

NOT EXISTS子句在這里似乎工作良好:

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
)

輸出:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM