2013-05-13 22 views
2
 
ID A B c D E(Time) 
--------------------------- 
1 J 1 A B 1 
2 J 1 A S 2 
3 M 1 A B 1 
4 M 1 A B 2 
5 M 2 A S 3 
6 M 2 A S 4 
7 T 1 A B 1 
8 T 2 A S 2 
9 T 1 A B 3 
10 k 1 A B 1 
11 k 1 A B 2 

我需要找到具有一些添加條件多列的唯一值。唯一值是Col A,B和D.的組合。多列條件檢查與多行被發現

如果Col A只有兩行(如記錄1和2)並且列B在兩個數據上都相同,並且存在與列D中不同的值,但S只是在B之後,我們不想看到這些記錄

如果列A只有多行(如記錄3到6)與不同的列B和D, ,而在樹狀DS是B我們不想看到這些記錄。

如果上面A只有多行(如記錄7到9)和不同的上B和D,則 ,而在D上有B上的S,我們希望看到這些記錄。

如果列A只有多行(如記錄10到11),並且列B不同,並且列D相同,我們不想查看這些記錄。

任何輸入,可能看到第一個和最後使用分區通過使用查詢無界吧......

好像基本邏輯是尋找,看看若S preceds任何B-然後在D列上顯示所有這些記錄...

期望的輸出是第7-9行:這是基於同一列A的邏輯,我們在訂單列E時間。

 

ID A B C D E(Time) 
--------------------------------------------------- 
7 T 1 A B 1 
8 T 2 A S 2 
9 T 1 A B 3 

+0

,嗯,你能不能給我們從這個所需輸出?至少,我很難理解你想要什麼。 – 2013-05-13 23:59:12

+0

當然,我想根據D列的行No no no no 7-9的輸出,因爲在那裏D列有一個S,然後再購買第7行第9行的記錄。 – newtooca 2013-05-14 00:01:29

+0

7 T 1 AB 1
8 T 2 AS 2
9 T 1 AB 3 – newtooca 2013-05-14 00:01:55

回答

0

我開始編寫一個查詢來做到這一點,但跑出來的「閒暇時間」,你的標準是非常難以遵循,如果你註釋掉「去哪兒」在查詢其功能底部但尚未產生您想要的效果。

可能這可能導致你的方向才達到你的目標......

WITH Src AS (
    SELECT 1 AS ID, 'J' AS A, 1 AS B, 'A' AS C, 'B' AS D, 1 AS E 
    UNION ALL SELECT 2, 'J', 1, 'A', 'S', 2 
    UNION ALL SELECT 3, 'M', 1, 'A', 'B', 1 
    UNION ALL SELECT 4, 'M', 1, 'A', 'B', 2 
    UNION ALL SELECT 5, 'M', 2, 'A', 'S', 3 
    UNION ALL SELECT 6, 'M', 2, 'A', 'S', 4 
    UNION ALL SELECT 7, 'T', 1, 'A', 'B', 1 
    UNION ALL SELECT 8, 'T', 2, 'A', 'S', 2 
    UNION ALL SELECT 9, 'T', 1, 'A', 'B', 3 
    UNION ALL SELECT 10, 'k', 1, 'A', 'B', 1 
    UNION ALL SELECT 11, 'k', 1, 'A', 'B', 2 
), ACnt AS (
    SELECT A, Count(*) AS Cnt 
    FROM Src 
    GROUP BY A 
), FirstD AS (
    SELECT A, D 
    FROM Src 
    WHERE E=1 
), FirstSRow AS (
    SELECT A, Min(E) AS E 
    FROM Src 
    WHERE D='S' 
    GROUP BY A 
), LastBRow AS (
    SELECT A, Max(E) AS E 
    FROM Src 
    WHERE D='B' 
    GROUP BY A 
), Mins AS (
    SELECT A, Min(D) AS D, Min(B) AS B 
    FROM Src 
    GROUP BY A 
), Maxs AS (
    SELECT A, Max(D) AS D, Max(B) AS B 
    FROM Src 
    GROUP BY A 
) 
SELECT Src.* 
FROM Src 
    JOIN ACnt ON ACnt.A=Src.A 
    JOIN FirstD ON FirstD.A=Src.A 
    JOIN Mins ON Mins.A=Src.A 
    JOIN Maxs ON Maxs.A=Src.A 
    LEFT JOIN FirstSRow ON FirstSRow.A=Src.A 
    LEFT JOIN LastBRow ON LastBRow.A=Src.A 
WHERE 
    NOT (ACnt.Cnt=2 AND Mins.B=Maxs.B AND Mins.D<>Maxs.D AND FirstSRow.E < LastBRow.E) 
    AND NOT (ACnt.Cnt>=3 AND Mins.B<>Maxs.B AND Mins.D<>Maxs.D AND FirstD.D='B') 
    AND (ACnt.Cnt>=3 AND Mins.B<>Maxs.B AND Mins.D<>Maxs.D AND FirstD.D='B')