2
ID AB c DE(时间)
--------------------------
1 J 1 AB 1
2 J 1 作为 2
3 M 1 AB 1
4 M 1 AB 2
5 米 2 作为 3
6 米 2 作为 4
7 T 1 AB 1
8 T 2 作为 2
9 T 1 AB 3
10千 1 AB 1
11千 1 AB 2

我需要找到具有多个列的唯一值以及一些附加条件。唯一值是 Col A、B 和 D 的组合。

如果 Col A 只有两行(如记录 1 和 2)并且 B 列在两个数据上都相同,并且与 D 列中的值不同,但是 S 仅在 B 之后出现,我们不想看到这些记录

如果 Col A 只有多行(如记录 3 到 6 )具有不同的 Col B 和 D,而在 COulmn DS 在 B 之后出现,我们不想看到这些记录。

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

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

任何输入,都能够使用 partition by 和在查询中使用 unbounded 查看第一个和最后一个...

似乎要查找的基本逻辑是查看 S 是否在 D 列上的任何 B 之前,然后使用分区显示所有这些记录...

所需的输出是第 7-9 行:这是基于同一列 A 的逻辑,当按 E 列时间订购时,我们在 D 列上从客户那里得到先卖后买。

ID ABCDE(时间)
-------------------------------------------------- -
7 T 1 AB 1
8 T 2 作为 2
9 T 1 AB 3

4

1 回答 1

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')
于 2013-05-14T20:10:38.957 回答