Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 要查找多行的多列条件检查_Sql - Fatal编程技术网

Sql 要查找多行的多列条件检查

Sql 要查找多行的多列条件检查,sql,Sql,我需要找到具有多列且带有一些附加条件的唯一值。唯一值是A列、B列和D列的组合 如果列A只有两行,如记录1和2,列B在两个数据上相同,并且有一个与列D不同的值,但S只在B之后,我们不想看到这些记录 如果列A只有多行,如记录3到6,具有不同的列B和D, 而在coulmnd中,S在B之后,我们不想看到那些记录 如果列A只有多行,如记录7到9,具有不同的列B和D, 而在coulmnd中,在B之前有a,S,我们希望看到这些记录 如果列A只有多行,如记录10到11,具有不同的列B和相同的列D,我们不希望看到

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

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

如果列A只有多行,如记录3到6,具有不同的列B和D, 而在coulmnd中,S在B之后,我们不想看到那些记录

如果列A只有多行,如记录7到9,具有不同的列B和D, 而在coulmnd中,在B之前有a,S,我们希望看到这些记录

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

任何输入,都可以使用partition by和unbounded in query查看第一个和最后一个输入

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

期望输出是第7-9行:这是基于同一列A的逻辑,当按E列时间订购时,我们在D列有一个客户的先卖后买

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
我开始写一个查询来做这件事,但是空闲时间用完了,你的条件很难遵循,如果你在查询底部的Where注释掉它的功能,但还没有产生你想要的效果

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

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
呃,你能给我们你想要的输出吗?一、 至少,我很难理解你想要的是什么。当然,我想要第7-9行基于第D列的输出,因为在第D列中,第7行记录购买前有一个S-第9.7行T1 a B 1 8 T 2 a S 2 9 T 1 a B 3这到底意味着什么?它没有意义,也无法理解。您的列未标记,D列和S/B列未定义它们的实际含义,然后是E列。。这是一个可怕的问题。如果不清楚,请道歉,B表示客户从我们这里购买了一些东西,S表示客户向我们出售了一些东西……我从长远角度来看数据。。
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')