在特定时间段内为每个日期选择一行

时间:2011-06-27 19:24:43

标签: sql

如果我在表中有时间戳的记录,我该如何查询,以便每个用户的每一天获得结果集中的行的结果以及来自另一个表的其他信息?

示例:

batch_log

id  |  userid | batchid | start_time         | end_time            |time_elapsed
----------------------------------------------------------------------------------
1   |  bob    | 123sgd  |2011-06-23 18:00:00 | 2011-06-23 18:12:00 | 00:12:00
2   |  jim    | 234sgd  |2011-06-22 12:00:00 | 2011-06-22 12:12:00 | 00:12:00
3   |  bob    | 1234gd  |2011-06-23 19:00:00 | 2011-06-23 19:08:00 | 00:08:00
4   |  bob    | 1Abeds  |2011-06-22 19:00:00 | 2011-06-23 20:24:00 | 00:24:00

的screwups

id  |  userid | time_of_screwup
---------------------------------------------
1   |  bob    |2011-06-23 19:29:16 
2   |  jim    |2011-06-23 16:29:24
3   |  bob    |2011-06-22 12:29:16 
4   |  bob    |2011-06-23 13:29:16 

如何选择以便每个人每天都能获得经过的时间和每天的拧紧次数,以便我可以将其提供给excel。

示例输出:

  userid | date       |COUNT(time_elapsed)| COUNT(screwups)|
------------------------------------------------------------
  bob    | 2011-06-23 | 00:20:00          |   2
  jim    | 2011-06-22 | 00:12:00          |   1
  bob    | 2011-06-22 | 00:24:00          |   1

编辑:更有意义的数据

2 个答案:

答案 0 :(得分:0)

在结果上有一个id字段并没有多大意义,所以我只是忽略该字段存在。同样地,我怀疑time_elapsed在同一天的不同工作运行中是否相同,所以我们会敲出来。

摆脱这两个字段会给我们留下一个相当简单的GROUP BY查询。我不知道你的数据库的细节,所以,出于这个问题的目的,我假设你的数据库有一个DATE()函数,它返回一个时间戳的日期部分。除非您在问题中遗漏了重要细节,否则batch_log表的存在是一个红色的鲱鱼。你真的只想SELECT userid, DATE(time_of_screwup), count(*) FROM screwups GROUP BY userid, DATE(time_of_screwup)

答案 1 :(得分:0)

以下内容应该可以解决问题。为了处理批量运行跨越几天的情况(例如,它从6月30日晚上11:50开始并在7月1日上午12:10结束),我们根据其开始时间任意地将事件分配给一天。 / p>

由于您尚未指定RDBMS,因此此代码适用于SQL Server。它假设日期/时间值是SQL Server DATETIME,并且经过的时间表示为SUM()可以使用的数据类型 - 可能是数值。

select userid             = t.userid ,
       report_date        = t.dtEvent ,
       total_batch_runs   = sum( case is_batch when 1 then 1 else 0 end ) ,
       total_screwups     = sum( case is_batch when 1 then 0 else 1 end ) ,
       total_elapsed_time = sum( t.elapsed_time ) ,
from ( select userid       = userid             ,
              is_batch     = 1 ,
              dtEvent      = date( start_time ) , -- date() only appropriate for SQL Server 2008
              elapsed_time = time_elapsed ,
       from dbo.batch_log
       UNION ALL
       select userid       = userid ,
              is_batch     = 0 ,
              dtEvent      = date( time_of_screwup ) , -- date() only appropriate for SQL Server 2008
              elapsed_time = null 
       from dbo.screwups
     ) t
group by t.userid , t.dtEvent
相关问题