当前位置: 首页 > 面试题库 >

查询记录并按时间段分组

施同
2023-03-14
问题内容

我有一个可能每天运行几次的应用程序。每次运行都会生成写入表的数据,以报告发生的事件。主报告表如下所示:

Id    SourceId    SourceType    DateCreated
5048  433         FILE          5/17/2011 9:14:12 AM
5049  346         FILE          5/17/2011 9:14:22 AM
5050  444         FILE          5/17/2011 9:14:51 AM
5051  279         FILE          5/17/2011 9:15:02 AM
5052  433         FILE          5/17/2011 12:34:12 AM
5053  346         FILE          5/17/2011 12:34:22 AM
5054  444         FILE          5/17/2011 12:34:51 AM
5055  279         FILE          5/17/2011 12:35:02 AM

我可以说有两次运行,但是我想要一种能够查询日期范围(运行过程的次数)的方法。我想查询一个查询,该查询导致进程开始的时间和组中的文件数。这种查询可以让我了解我想要的东西,因为我可以看到什么日期和时间以及运行了多少文件,但不完全是我想要的。例如,它不能适应从8:58到9:04的运行。例如,它还会对从9:02和9:15开始的运行进行分组。

Select dateadd(day,0,datediff(day,0,DateCreated)) as [Date], datepart(hour, DateCreated) as [Hour], Count(*) [File Count]
From   MyReportTable
Where DateCreated between '5/4/2011' and '5/18/2011'
    and SourceType = 'File'
Group By dateadd(day,0,datediff(day,0,DateCreated)), datepart(hour, DateCreated)
Order By dateadd(day,0,datediff(day,0,DateCreated)), datepart(hour, DateCreated)

我知道,所有接近的运行都可能会归为一组,对此我很好。我只希望得到一个大致的分组。

谢谢!


问题答案:

如果您确定这些运行是连续的并且不重叠,则应该可以使用Id字段来拆分组。查找仅相距1的ID字段以及大于相差某个阈值的日期创建的字段。从您的数据来看,一次运行中的记录看起来最多只能在1分钟内输入一次,因此安全阈值可能是1分钟或更长。

这将为您提供开始时间

SELECT mrtB.Id, mrtB.DateCreated
FROM MyReportTable AS mrtA
INNER JOIN MyReportTable AS mrtB
    ON (mrtA.Id + 1) = mrtB.Id
WHERE DateDiff(mi, mrtA.DateCreated, mrtB.DateCreated) >= 1

我称它为DataRunStarts

现在,您可以使用它来获取有关组的开始和结束位置的信息

SELECT drsA.Id AS StartID, drsA.DateCreated, Min(drsB.Id) AS ExcludedEndId
FROM DataRunStarts AS drsA, DataRunStarts AS drsB
WHERE (((drsB.Id)>[drsA].[id]))
GROUP BY drsA.Id, drsA.DateCreated

我将其称为DataRunGroups。我将最后一个字段称为“已排除”,因为它所持有的ID仅用于定义将被拉出的ID集的结束边界。

现在我们可以使用DataRunGroups和MyReportTable来获取计数

SELECT DataRunGroups.StartID, Count(MyReportTable.Id) AS CountOfRecords
FROM DataRunGroups, MyReportTable
WHERE (((MyReportTable.Id)>=[StartId] And (MyReportTable.Id)<[ExcludedEndId]))
GROUP BY DataRunGroups.StartID;

我称它为DataRunCounts

现在,我们可以将DataRunGroups和DataRunCounts放在一起以获取开始时间和计数。

SELECT DataRunGroups.DateCreated, DataRunCounts.CountOfRecords
FROM DataRunGroups
INNER JOIN DataRunCounts
    ON DataRunGroups.StartID = DataRunCounts.StartID;

Depending on your setup, you may need to do all of this on one query, but you
get the idea. Also, the very first and very last runs wouldn’t be included in
this, because there’d be no start id to go by for the very first run, and no
end id to go by for the very last run. To include those, you would make
queries for just those two ranges, and union them together along with the old
DataRunGroups query to create a new DataRunGroups. The other queries that use
DataRunGroups would work just as described above.




 类似资料:
  • 问题内容: 我有一个包含datetime列和一些其他列的表。datetime列表示发生的事件。它可以包含一个时间(事件在那个时间发生)或NULL(事件没有发生) 我现在想计算在特定时间间隔(15分钟)内发生的记录数,但是不知道该怎么做。 例子: 现在,我想创建一个查询,该查询将创建类似于以下内容的结果集: 这在SQL中可能吗,或者有人可以建议我可以使用哪些其他工具?(例如,将数据导出到电子表格程序

  • 我得到的数据集如下所示: 我想按时间字段对其进行分组,并获取每个时间间隔的MAX(openBid),并拥有最后5个间隔(在本例中为5分钟)。我使用这个查询: 结果如下: 我遇到的问题是,随着时间的推移,结果集中第一条记录的计数从1增加到5。在这个例子中,它是3。我希望我的查询在所有时间间隔内都有相同数量的记录。我认为问题是GROUP BY准时从集合的第一条记录开始。由于我正在执行ORDER BY

  • 问题内容: 我有这个SQL查询: 结果是这样的: 我现在的问题是我无法将DateCreated分组,因为它具有不同的时间。 我只想按日期分组。范例:2010-09-12 谢谢并恭祝安康… 问题答案: 我认为值得单独发布以下内容: 使用char转换来削减超时日期(广播或转换为varchar)比使用慢。我制定了[完整的脚本和性能测试结果以支持此断言 另外,请注意,您的GROUP BY列表与SELECT

  • 我有一个表abc,其中可以针对一个UserId有一个或多个行。abc表有列值。我希望结果是每个UserId值的总和。 示例:userid1- 我现在拥有的: 结果:它单独返回每行的总和。所以我有这样的: 用户标识1- 我应该更改或添加什么来完成查询? PS.我知道这是一个非常常见/简单的解决方案,但似乎找不到任何解决方案。:(

  • 我在Athena中有一个表,其中每个记录都有一个时间戳,如。 这方面的SQL语句是什么?我试过使用和,但我不确定我是否正确地使用了它,或者它是否在Presto(雅典娜的SQL查询引擎)中得到支持。 任何帮助都会很好!

  • 问题内容: 我有一个包含会话事件时间戳的表。我想根据时间戳查询两个会话之间至少有10分钟的事件间隔时,我有多少会话。我可以使用MySql查询来计算会话数吗? 谢谢 问题答案: 在您的桌子上只有很少的信息,这对您来说只是一个基本的想法,但是您可以执行以下操作: 获取所有时间戳,并将它们与所有其他较大的时间戳合并,然后使用MIN将其缩小到下一个最大的时间戳。然后从中选择差异小于600秒的计数(假设使用