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,我们不希望看到这些记录 任何输入,都可以使用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 2Sql 要查找多行的多列条件检查,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,我们不希望看到
我开始写一个查询来做这件事,但是空闲时间用完了,你的条件很难遵循,如果你在查询底部的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')