计数和分组 SQL

COUNT and GROUP BY SQL

我在左侧有一个示例数据 table,预期的输出在右侧。

输出要求为:

例如,在时间 6,有 3 个模型 A,序列号为 1,2,7,但我们只计算序列号 7,因为第一行 (1-A-6) 与下一行有重复的序列号第 (1-A-7) 行,所以我们不计算 (1-A-6)。

问题是,我怎样才能进行 SQL 查询以仅在一个查询中获取类似输出的数据?

下面的技术使用 ROW_NUMBER 和子查询来获取每个序列的最后一个实例,然后使用 GROUP BYCOUNT 来执行聚合。这些应该由通用 DBMS 支持(因为您没有指定 SQL 服务器或 MySQL 或其他)。

SELECT
    [Time],
    [Model],
    COUNT(*) AS [Count]
FROM (
    SELECT 
        [Time],
        [Model],
        [Serial],
        -- Paritioning by serial, get last instance of the serial
        ROW_NUMBER() OVER (PARTITION BY Serial ORDER BY RowNum DESC) AS RowNum
    FROM (
        SELECT
            [Time],
            [Model],
            [Serial],
            -- Add a row number to help find the last value per requirements
            ROW_NUMBER() OVER (ORDER BY [Serial]) AS RowNum
        FROM @T -- Your table here
        ) T
    ) T
WHERE RowNum = 1 -- Get last instance of the serial
GROUP BY
    [Time],
    [Model]
ORDER BY
    [Time]

正在使用 SQL 服务器进行测试:

DECLARE @T TABLE ([Serial] INT, [Model] CHAR(1), [Time] INT)
INSERT @T VALUES (1,'A', 6),(1, 'A', 7),(2,'A',6),(2,'A',7),
    (2,'A',9),(3,'A',8),(4,'A',8),(5,'B',9),(6,'B',9),(7,'A',6),
    (8,'B',10),(9,'B',8),(10,'B',8)

达到预期的输出:

Time        Model Count
----------- ----- -----------
6           A     1
7           A     1
8           A     2
8           B     2
9           A     1
9           B     2
10          B     1