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

Posted

技术标签:

【中文标题】SQL 中的多个聚合从单个值的查询开始【英文标题】:Multiple aggregates in SQL starting from a query for a single value 【发布时间】:2021-05-14 23:33:52 【问题描述】:

Log 表开始,其中根据 3 个不同设备的 序列号 注册不同的操作ReferenceId em>),我可以使用以下查询为单个 序列号 选择所需的结果:

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

【问题讨论】:

请显示样本数据(DDL+DML)和预期结果(格式化文本)。 我强烈建议您使用 UNION ALL 而不是 UNION,除非您特别想删除重复项并遭受随之而来的性能损失。 【参考方案1】:

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

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;

【讨论】:

嗨蒂姆,感谢您的快速回复。我尝试了你的两个提示,但我没有得到完全相同的结果。例如,有一个序列号,我使用单个查询得到 0 个结果,使用你的查询得到 1 行。问题是您的查询似乎不只考虑按 Id 排序的第一行。如果您需要具体示例以便更好地理解,请告诉我,谢谢。 如果没有先看到一些示例数据,我不会推测我的答案(或您的问题)可能有什么问题。将示例数据添加到您的问题中,清楚地解释您想要的逻辑。 @ilCosmico 检查我认为可能是您想要的更新答案。现在我对序列号和参考 ID 进行分区,然后在外部查询中限制为少数几个参考 ID。 我刚刚检查过了,但是序列 XXXXX 的结果仍然给出了 ID 为 7587 的行 尝试将Operation 的限制移至外部查询。

以上是关于SQL 中的多个聚合从单个值的查询开始的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单个 SQL 聚合函数查询为同一个聚合函数获取多个结果?

带有子查询的 SQL 多个聚合函数

在单个聚合查询 mongodb 中组合多个 $samples

从提取多个值的列中查询单个值

LINQ to SQL:对来自订购系统的多个表的报告的聚合数据进行复杂查询

从SQL聚合行组合值并将NULL删除到单个行中