首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dense_rank和sum

Dense_rank和sum
EN

Stack Overflow用户
提问于 2013-10-07 11:27:38
回答 1查看 396关注 0票数 0

我有一个常见的表表达式

代码语言:javascript
复制
WITH total_hour
AS (
    SELECT 
      employee_id,
      SUM(ROUND(CAST(DATEDIFF(MINUTE, start_time, finish_time) AS NUMERIC(18, 0)) / 60, 2)) AS total_h
    FROM Timesheet t
    WHERE t.employee_id = @employee_id
      AND DENSE_RANK() OVER (
        ORDER BY DATEDIFF(DAY, '20130925', date_worked) / 7 DESC ) = @rank
    GROUP BY t.personnel_id
    )

这是示例数据:

代码语言:javascript
复制
ID  employee_id     worked_date     start_time      finish_time
 1     1          2013-09-25        09:00:00    17:30:00        
 2     1          2013-09-26        07:00:00    17:00:00    
 8     1          2013-10-01        09:00:00    17:00:00    
 9     1          2013-10-04        09:00:00    17:00:00    
 12    1          2013-10-07        09:00:00    17:00:00    
 13    1          2013-10-30        09:00:00    17:00:00    
 14    1          2013-10-28        09:00:00    17:00:00    
 15    1          2013-11-01        09:00:00    17:00:00

假设星期三是一周的第一天,我的基准日期是2013-09-25。我想得到的总工作时数从09-25到10-01当@排名是1,总小时从10-02到10-08,当@rank=2等等。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-07 12:09:20

要想获得员工在一周内工作的小时数,只需使用合适的工作地点标准即可。不需要为此使用DENSE_RANK或类似的窗口函数。

假设您有一个@Week参数,它包含一个整数(当前周为0,上周为1,前一周为2,等等):

代码语言:javascript
复制
SELECT
    employee_id
    SUM(ROUND(CAST(DATEDIFF(MINUTE, start_time, finish_time) AS NUMERIC(18, 0)) / 60, 2)) AS total_h
FROM
    Timesheet t
WHERE
    t.employee_id = @employee_id AND
    date_worked BETWEEN DATEADD(ww, DATEDIFF(ww,0,GETDATE()) - @Week, 0)
                    AND DATEADD(ww, DATEDIFF(ww,0,GETDATE()) - @Week, 0) + 7

在这里,我使用了当前日期(GETDATE())作为基准日期,但是如果需要的话,可以用20130925替换它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19223671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档