计数和分组 SQL
COUNT and GROUP BY SQL
我在左侧有一个示例数据 table,预期的输出在右侧。
输出要求为:
- COUNT按时间和型号统计serial和Group。
- 如果有超过 1 个序列号具有相同的值,则选择最后一个。
例如,在时间 6,有 3 个模型 A,序列号为 1,2,7,但我们只计算序列号 7,因为第一行 (1-A-6) 与下一行有重复的序列号第 (1-A-7) 行,所以我们不计算 (1-A-6)。
问题是,我怎样才能进行 SQL 查询以仅在一个查询中获取类似输出的数据?
下面的技术使用 ROW_NUMBER
和子查询来获取每个序列的最后一个实例,然后使用 GROUP BY
和 COUNT
来执行聚合。这些应该由通用 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
我在左侧有一个示例数据 table,预期的输出在右侧。
输出要求为:
- COUNT按时间和型号统计serial和Group。
- 如果有超过 1 个序列号具有相同的值,则选择最后一个。
例如,在时间 6,有 3 个模型 A,序列号为 1,2,7,但我们只计算序列号 7,因为第一行 (1-A-6) 与下一行有重复的序列号第 (1-A-7) 行,所以我们不计算 (1-A-6)。
问题是,我怎样才能进行 SQL 查询以仅在一个查询中获取类似输出的数据?
下面的技术使用 ROW_NUMBER
和子查询来获取每个序列的最后一个实例,然后使用 GROUP BY
和 COUNT
来执行聚合。这些应该由通用 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