可以找到多行的多列条件检查

时间:2013-05-13 23:16:19

标签: sql

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之后我们不想看到那些记录

如果Col A只有多行(如记录3到6),而且Col B和D不同, 而在CO中,D S是在B之后,我们不想看到那些记录。

如果Col A只有多行(如记录7到9),而且Col B和D不同, 而在CO中,在B之前有一个S,我们希望看到那些记录。

如果Col A只有多行(如记录10到11),并且有不同的Col B和相同的D列,我们不希望看到这些记录。

任何输入,能够使用分区来查看它的第一个和最后一个并在查询中使用无界...

看起来像是要查找的基本逻辑,看看S是否在D列上预先显示任何B然后使用分区显示所有这些记录...

所需的输出是第7-9行:这是基于同一列A的逻辑,当按照E列时间排序时,我们在D列的客户买入之前有卖出。


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

1 个答案:

答案 0 :(得分:0)

我开始编写一个查询来执行此操作,但是用完了“备用时间”,您的条件很难遵循,如果您在查询底部注释掉“Where”,它会起作用但不会然而产生你想要的效果。

这可能会让你朝着实现目标的方向前进......

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')