选择具有总和(工作时间)的用户的最大日期< X

时间:2015-04-12 19:30:28

标签: mysql sql sql-server

需要查询帮助 - 我同时使用SQL Server和MySQL。

我有一个用户工作时间表,如下所示:

USER  WORKTIME DATE
user1 08:00:00 2015-03-01
user1 08:00:00 2015-03-02
user1 08:00:00 2015-03-03
user2 08:30:00 2015-03-11
user2 10:00:00 2015-03-13
user3 05:00:00 2015-03-11
user3 05:00:00 2015-03-12
user3 05:00:00 2015-03-14

我需要的是每个用户的最后日期,当他的工作时间总和小于或等于x时 - 对于这个例子,让我们说它是18 - 加上该日期的工作时间总和 - 所以我的结果应该是:

USER  WORKTIME DATE
user1 16:00:00 2015-03-02
user2 08:30:00 2015-03-11
user3 15:00:00 2015-03-14

使用这样的简单查询时:

select user, 
       sum(worktime), 
       max(date)
from worktime
group by user
having sum(worktime) <= 18

我只获得总小时数<= 18的用户,本例中为user3。

我知道如何使用2个单独的查询和一些excel函数来完成它,但是想知道是否可以在单个语句中执行此操作。

2 个答案:

答案 0 :(得分:1)

如果两个数据库都需要这个,那么我会建议一个相关的子查询来获取累积的时间。然后,您可以获得所需的值:

select user, max(date)
from (select wk.*,
             (select sum(wk2.worktime)
              from worktime wk2
              where wk2.user = wk.user and
                    wk2.date <= wk.date
             ) cume_worktime
      from worktime wk
     ) t
where cume_worktime <= 18
group by user;

这是ANSI标准SQL,应该可以在两个数据库中使用。

答案 1 :(得分:0)

使用相同的表格进行左联接(没有对其进行测试,但应该是这些行中的内容):

select u.user, sum(u.worktime), max(u.date),
sum(u1.worktime)
from worktime AS u LEFT JOIN worktime AS u1 ON u.user=u1.user WHERE u1.date<max(u.date)
group by u.user
having sum(u.worktime) <= 18