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