SQL 中的多个聚合从对单个值的查询开始

Multiple aggregates in SQL starting from a query for a single value

Log table 开始,根据 序列号 Operations table =31=] 对于 3 个不同的设备 (ReferenceId),我能够 select 单个 序列号 的期望结果使用以下查询:

DECLARE @serialNumber varchar(256)
SET @serialNumber = 'XXXXX'

SELECT *
FROM Log
WHERE ID IN (
    SELECT TOP 1 ID FROM Log WHERE SerialNumber = @serialNumber AND ReferenceId = 1 ORDER BY Id desc
    UNION
    SELECT TOP 1 ID FROM Log WHERE SerialNumber = @serialNumber AND ReferenceId = 2 ORDER BY Id desc
    UNION
    SELECT TOP 1 ID FROM Log WHERE SerialNumber = @serialNumber AND ReferenceId = 3 ORDER BY Id desc
)
AND Operation = 3

如何使用唯一聚合查询获得所有 序列号 的结果?

更新

为单个序列号提取的样本数据

SELECT Id, SerialNumber, ReferenceId, Operation FROM ActivationLog WHERE SerialNumber = @serialNumber;

6678    XXXXX   1   0
6991    XXXXX   1   1
6992    XXXXX   1   0
7315    XXXXX   1   1
7317    XXXXX   1   0
7396    XXXXX   1   1
7397    XXXXX   1   0
7581    XXXXX   3   3
7582    XXXXX   3   1
7587    XXXXX   3   3
7588    XXXXX   3   1
7595    XXXXX   1   0
7596    XXXXX   1   1
7597    XXXXX   1   0
7598    XXXXX   1   1
7599    XXXXX   1   0
7632    XXXXX   1   1
7633    XXXXX   1   0
7758    XXXXX   1   1
7784    XXXXX   1   0
7898    XXXXX   1   1
7899    XXXXX   1   0

使用我的查询结果是0行。 尝试@Tim Biegeleisen 建议的查询(但针对单个序列号进行过滤),我得到 1 行。

SELECT TOP 1 WITH TIES Id, SerialNumber, ReferenceId, Operation
FROM ActivationLog
WHERE ReferenceId IN (1, 2, 3) AND Operation = 3 AND SerialNumber=@serialNumber
ORDER BY ROW_NUMBER() OVER (PARTITION BY SerialNumber ORDER BY Id DESC)

7587    XXXXX   3   3

根据您更新后的问题,您似乎想要以下内容:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY SerialNumber, ReferenceId
                                 ORDER BY Id DESC) rn
    FROM Log
)

SELECT *
FROM cte
WHERE rn = 1 AND ReferenceId IN (1, 2, 3) AND Operation = 3;