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;
从 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;