[英]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.