COUNT和GROUP BY SQL

时间:2015-06-25 15:47:27

标签: sql count group-by

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

View of example data and desired query output

输出要求是:

  • COUNT按时间和型号计算序列和组。
  • 如果有超过1个序列具有相同的值,请选择最后一个。

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

问题是,如何在一个查询中创建SQL查询以获取输出等数据?

1 个答案:

答案 0 :(得分:2)

下面的技术使用ROW_NUMBER和子查询来获取每个序列的最后一个实例,然后使用GROUP BYCOUNT来执行聚合。这些应该由普通的DBMS支持(因为你没有指定SQL Server或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 Server进行测试:

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