我在左表中有一个示例数据,预期输出在右侧。
输出要求是:
例如,在时间6,有3个型号A,序列号为1,2,7,但我们只计算序列号7,因为第一行(1-A-6)有一个重复的序列到下一行( 1-A-7)所以我们不计算(1-A-6)。
问题是,如何在一个查询中创建SQL查询以获取输出等数据?
答案 0 :(得分:2)
下面的技术使用ROW_NUMBER
和子查询来获取每个序列的最后一个实例,然后使用GROUP BY
和COUNT
来执行聚合。这些应该由普通的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