对多个日期范围进行分组的 SQL 查询

标签 sql sql-server sql-server-2008 tsql group-by

我需要制定一个 t-sql 查询,但到目前为止我还无法这样做。我需要查询的表称为“Operations”,具有两列:FK OperationTypeID 和OperationDate。查询需要返回一个结果,该结果包含指定范围内操作类型id的计数。

通过应用程序界面,用户可以指定多个操作类型Id以及它们各自的日期范围,例如操作类型id'可以在范围内寻找A' 22/04/201022/04/2012operationtype Id 'B' 可以在 15/10/2012 中搜索15/11/2013 等其他操作类型 ID。现在,我需要在为各个操作类型 ID 指定的每个范围内返回每个操作类型 ID 的计数。

考虑到性能问题,在单个 t-sql 查询中实现此目的最有效的方法是什么...下面提供了一个粗略的布局,我不太擅长格式化,所以我希望它仍然能提供一个想法。

+---------------+----------+----------+-----+
|OperationTypeID|Min date  |Max Date  |Count|
+---------------+----------+----------+-----+
|A              |22/04/2010|22/04/2012|899  |
+---------------+----------+----------+-----+
|B              |15/10/2012|15/11/2013|789  |
+---------------+----------+----------+-----+

...等等

如果有人能提供帮助,我将不胜感激。查询需要根据用户指定的最小/最大日期范围返回每个操作类型 ID 的计数。 sql server 中可用的 Min/Max 函数可能不适用于此处。到目前为止,我想到的一种可能的方法是使用 Union All 方法,在该方法中,我根据日期范围对单个操作类型 id 制定单个查询,然后执行 UNION All,对性能有影响吗?

最佳答案

您需要将搜索条件存储在某处。最好的地方可能是一个包含以下列的临时表:

CREATE TABLE #SearchCriteria (
    OperationTypeId VARCHAR(1)
    MinDate DATETIME
    MaxDate DATETIME
)

现在,一旦您填充了此表,像这样的简单查询应该会为您提供您想要的内容:

SELECT OperationTypeId, 
    MinDate, 
    MaxDate,
    (SELECT COUNT(*) FROM Operations 
      WHERE OperationDate BETWEEN SC.MinDate AND SC.MaxDate 
        AND OperationTypeId = SC.OperationTypeId) AS [Count]
FROM
    #SearchCriteria SC

如果您必须在单个查询中包含所有内容(不使用临时表),请执行以下操作:

SELECT OperationTypeId, 
    MinDate, 
    MaxDate,
    (SELECT COUNT(*) FROM Operations 
      WHERE OperationDate BETWEEN SC.MinDate AND SC.MaxDate 
        AND OperationTypeId = SC.OperationTypeId) AS [Count]
FROM
    (VALUES ('A', '22/04/2010', '22/04/2012')
           ,('B', '15/10/2012', '15/11/2013')
         /* ... etc ... */
    ) SC(OperationTypeId, MinDate, MaxDate)

关于对多个日期范围进行分组的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21084906/

相关文章:

日期列的 MySQL 条件 ORDER BY ASC/DESC

sql - sp_helptext 更改我的缩进

mysql - 如何删除MySQL表中的重复行?

sql - 如何从聚合文本字段中解析和删除重复项

SQL查询以获取仅显示表中最新日期的数据

c# - 使用 SqlBulkCopy 插入 GUID

sql - 每月记录数

sql - 使用SQL获取未知字符串的模式?

sql - cfquery 文本编码问题

sql-server - Entity Framework 中的新对象 - 主键问题