2016-01-05 33 views
0

我有如下數據(小提琴 - http://sqlfiddle.com/#!6/9eecb7db59d16c80417c72d1/3757):選擇基於沒有組一列獨特的結果通過

SELECT * FROM 
(
    SELECT 1 AS Id1, 1000 AS Id2, NULL AS Item1, 1 AS Item2 --this should be removed from my results 
    UNION SELECT 1 AS Id1, 1000 AS Id2, NULL AS Item1, 2 AS Item2 
    UNION SELECT 3 AS Id1, 1000 AS Id2, 0 AS Item1, 0 AS Item2 
    UNION SELECT 4 AS Id1, 1000 AS Id2, 1 AS Item1, 1 AS Item2 

    --BELOW DATA DIFFERS FROM THE ABOVE ONLY ON Id2 
    UNION SELECT 1 AS Id1, 2000 AS Id2, NULL AS Item1, 1 AS Item2 --this should be removed from my results 
    UNION SELECT 1 AS Id1, 2000 AS Id2, NULL AS Item1, 2 AS Item2 
    UNION SELECT 3 AS Id1, 2000 AS Id2, 0 AS Item1, 0 AS Item2 
    UNION SELECT 4 AS Id1, 2000 AS Id2, 1 AS Item1, 1 AS Item2 
) AS TestData 

我需要過濾TestData,只得到不同Id1, Id2。結果必須符合以下規則:

  1. 下面所有的規則都必須遵循Id2分組(我的意思是下面僅適用於由Id2列定義行組)。這意味着TestData數據集包含兩組 - 1000,2000
  2. 所有行Item1比賽Item2是好的,應該是始終返回
  3. 如果2.不被滿足,則取該行只有Item1NULLItem2沒有匹配的任何地方TestData(規則1.仍然適用 - 所以,我們需要通過當前組數據集中查找)

總而言之,我需要從TestData得到每個組的第一行旁邊的所有Id。另外,請注意,我知道我可以簡單地致電SELECT DISTINCT並擁有適當的Id,但在此情況並非如此。由於Item2已在組中的匹配項(規則3),所以我的問題比上面描述的更大,基本上我想知道的是如何從上述數據中的每個組中刪除第一行。

+0

這看起來很像一個家庭作業。你試過什麼了? –

+0

是的,這是很多功課好。今天在這個工作上花了半天時間......我沒有什麼可以分享的,因爲我還沒有嘗試過。我基本上重寫了蹩腳的SQL,上面是我在離開工作前被卡住的結果。所以也許這裏有人會對如何避免使用Group By有任何提示,如果不是的話,那麼明天我可能會再花半天時間。 – ojek

+2

您能否提供您期望從樣本數據中輸出的數據?我不確定我是否理解你的所有標準。 –

回答

2

這將返回您所期望的行。 COALESCE是一個快捷方式,所以如果您的數據中可能有負值,那麼您需要展開查詢的這些部分以考慮NULL值。如果其他列允許使用NULL值,則可能還需要添加其他檢查。

SELECT 
    T1.id1, 
    T1.id2, 
    T1.item1, 
    T1.item2 
FROM 
    My_Table T1 
WHERE 
    COALESCE(T1.item1, -1) = COALESCE(T1.item2, -1) OR 
    (
     T1.item1 IS NULL AND 
     NOT EXISTS 
     (
      SELECT * 
      FROM 
       My_Table T2 
      WHERE 
       T2.id2 = T1.id2 AND 
       COALESCE(T2.item1, -1) <> COALESCE(T1.item1, -1) AND 
       T2.item2 = T1.item2 
     ) 
    ) 
ORDER BY 
    T1.id2, 
    T1.id1 
+0

謝謝湯姆!在早些時候處理此解決方案時,我正在爲類似的事情苦苦掙扎。我現在沒有權限訪問ssms,但是如果我正確記得 - 在我的原始腳本中,我使用的是公用表表達式。而在你使用'T2'的地方,我嘗試了第二次使用CTE,但是我認爲我在那裏失敗了。我需要在你使用'T2'的地方實例化我的'T1'。這可能很困難,因爲我的CTE非常複雜,明天需要重新考慮。感謝您的幫助。 :) – ojek