1

假设我有下表(ID是自增的)

ID    Name    Serial   Status
0     Pie     A        Fail
1     Pie     A        Fail
2     Pie     A        Pass
3     Pie     B        Fail
4     Pie     B        Pass
5     Pie     C        Pass
6     Pie     C        Fail

如何获取每个 Group By (Name, Serial) 的最后一行为 Pass 的所有行?

这是我应该从查询中得到的结果。序列 C 被删除,因为(名称,序列)组的最后一个条目是“失败”

 ID    Name    Serial   Status
 0     Pie     A        Fail
 1     Pie     A        Fail
 2     Pie     A        Pass
 3     Pie     B        Fail
 4     Pie     B        Pass

谢谢!

4

2 回答 2

1

我会尝试这样的事情(假设 SQL Server):

DECLARE @myTable AS TABLE(
    ID INT, 
    Name VARCHAR(10), 
    Serial VARCHAR(1), 
    [Status] VARCHAR(10))

INSERT INTO @myTable VALUES(0, 'Pie', 'A', 'Fail')
INSERT INTO @myTable VALUES(1, 'Pie', 'A', 'Fail')
INSERT INTO @myTable VALUES(2, 'Pie', 'A', 'Pass')
INSERT INTO @myTable VALUES(3, 'Pie', 'B', 'Fail')
INSERT INTO @myTable VALUES(4, 'Pie', 'B', 'Pass')
INSERT INTO @myTable VALUES(5, 'Pie', 'C', 'Pass')
INSERT INTO @myTable VALUES(6, 'Pie', 'C', 'Fail')

SELECT * 
FROM @myTable
WHERE Serial NOT IN
(
    --Get all Serial that end with a 'Fail'
    SELECT T1.Serial
    FROM @myTable T1
    JOIN (
        --Get Max ID for a serial
        SELECT MAX(ID) as [ID] FROM @myTable GROUP BY Serial
    ) T2 ON T1.[ID] = T2.[ID]
    WHERE T1.[Status] = 'Fail'
)
ORDER BY [ID]

或者如果您愿意NOT EXISTS(通常比 快NOT IN):

SELECT * 
FROM @myTable T
WHERE NOT EXISTS
(
    SELECT 
        T1.Serial
    FROM @myTable T1
    JOIN (
        --Get Max ID for a serial
        SELECT MAX(ID) as [ID] FROM @myTable GROUP BY Serial
    ) T2 ON T1.[ID] = T2.[ID]
    WHERE 
        T1.[Status] = 'Fail' 
        AND T1.[Serial] = T.[Serial]
)
ORDER BY [ID]
于 2013-03-16T01:55:26.413 回答
0

我们可以使用CTE通过实现一系列顺序步骤来提高可读性:

  1. 获取最大 id
  2. 获取状态为“失败”的最大 ID 的连续剧
  3. 删除那些与连续剧匹配的行

它看起来像这样:

with maxIds as ( --Get max Ids
                SELECT MAX(ID) as [ID] FROM myTable GROUP BY Serial
 ), 
serials as ( -- Get serials for max ids that have status 'Fail'
           SELECT T1.Serial FROM myTable T1 JOIN maxIds ON T1.[ID] = maxIds.[ID] WHERE [Status] = 'Fail' 
)  
select * from myTable where serial not in (select * from serials) -- Remove serials that match
于 2013-03-16T02:36:46.790 回答