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

SQL-计算日期速率内的项目活动数

施阳夏
2023-03-14
问题内容

我有一个数据集ResourcesProjectsStartDateEndDate。每个资源可以被多个项目利用。

我想统计每个季度使用资源的项目数量。

因此,如果项目在特定年份的Q1开始并在当年的Q3结束,而project2在Q2开始并在Q3结束,那么我想为Q2计数2个项目,因为在Q1期间,project1和project2都处于活动状态。

这是我的数据集:

create table Projects
(Resource_Name varchar(20)
,Project_Name varchar(20)
,StartDate varchar(20)
,EndDate varchar(20)
)


insert into Projects values('Resource 1','Project A','15/01/2013','1/11/2014')
insert into Projects values('Resource 1','Project B','1/03/2013','1/09/2016')
insert into Projects values('Resource 1','Project C','1/04/2013','1/09/2015')
insert into Projects values('Resource 1','Project D','1/06/2013','1/03/2016')
insert into Projects values('Resource 1','Project E','15/01/2013','1/09/2015')
insert into Projects values('Resource 1','Project F','3/06/2013','1/11/2015')

这是我要寻找的结果:

Resource Name| Year | Quarter|Active Projects
Resource 1     2013     1           2
Resource 1     2013     2           6

问题答案:

使用理货单:

使用from的日期Projects,生成所有季度及其开始日期和结束日期的列表,在本示例中为CteQuarter(sd, ed)。在此之后,你只需要JOINProjectsCteQuarter的日期重叠。最后,GROUP BY使用日期的YEARQuarter部分。

SQL小提琴

WITH CteYear(yr) AS(
    SELECT number
    FROM master..spt_values
    WHERE 
        type = 'P'
        AND number >= (SELECT MIN(YEAR(CONVERT(DATE, StartDate, 103))) FROM Projects)
        AND number <= (SELECT MAX(YEAR(CONVERT(DATE, EndDate, 103))) FROM Projects)
),
CteQuarter(sd, ed) AS(
    SELECT
        DATEADD(QUARTER, q.n - 1, DATEADD(YEAR, cy.yr - 1900, 0)),
        DATEADD(DAY, -1, DATEADD(QUARTER, q.n, DATEADD(YEAR, cy.yr - 1900, 0)))
    FROM CteYear AS cy
    CROSS JOIN(
        SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
    ) AS q(n)
)
SELECT 
    p.Resource_Name,
    [Year] = DATEPART(YEAR, q.sd),
    [Quarter] = DATEPART(QUARTER, q.sd),
    [Active Projects] = COUNT(*)
FROM Projects p
INNER JOIN CteQuarter q
    ON CONVERT(DATE, StartDate, 103) <= q.ed
    AND CONVERT(DATE, EndDate, 103) >= q.sd
GROUP BY 
    p.Resource_Name,
    DATEPART(YEAR, q.sd),
    DATEPART(QUARTER, q.sd)
ORDER BY
    p.Resource_Name,
    DATEPART(YEAR, q.sd),
    DATEPART(QUARTER, q.sd)

结果:

| Resource_Name | Year | Quarter | Active Projects |
|---------------|------|---------|-----------------|
|    Resource 1 | 2013 |       1 |               3 |
|    Resource 1 | 2013 |       2 |               6 |
|    Resource 1 | 2013 |       3 |               6 |
|    Resource 1 | 2013 |       4 |               6 |
|    Resource 1 | 2014 |       1 |               6 |
|    Resource 1 | 2014 |       2 |               6 |
|    Resource 1 | 2014 |       3 |               6 |
|    Resource 1 | 2014 |       4 |               6 |
|    Resource 1 | 2015 |       1 |               5 |
|    Resource 1 | 2015 |       2 |               5 |
|    Resource 1 | 2015 |       3 |               5 |
|    Resource 1 | 2015 |       4 |               3 |
|    Resource 1 | 2016 |       1 |               2 |
|    Resource 1 | 2016 |       2 |               1 |
|    Resource 1 | 2016 |       3 |               1 |


 类似资料:
  • 问题 你需要在给出的年份中找到复活节的月份和日期。 解决方案 下面的函数返回数组有两个要素:复活节的月份( 1-12 )和日期。如果没有给出任何参数,给出的结果是当前的一年。这是 在CoffeeScript 的匿名公历算法实现的。 gregorianEaster = (year = (new Date).getFullYear()) -> a = year % 19 b = ~~(year

  • 问题内容: 编写一个程序来计算复活节星期天的日期。复活节星期日是春天的第一个满月之后的第一个星期日。使用数学家卡尔·弗里德里希·高斯(Carl Friedrich Gauss)在1800年发明的算法: 让是年份(如1800年或2001年) 除以通过并调用剩余。忽略商。 除以通过获得商和余数。 除以通过获得商和余数。 除以通过获得商。忽略其余部分。 除以通过得到的余数。忽略商。 除以通过获得商和余数

  • 问题内容: 我有一个3列和数千行的表,前2列有数据。第三列当前为空,我需要根据第一列和第二列中已有的数据填充第三列。 假设我在第一栏中有状态,在第二栏中有水果条目。我需要编写一条SQL语句来计算 每种水果来自的不同状态数 ,然后将此流行度数字插入到每一行的第三列中。该行中的受欢迎程度数字1表示水果仅来自一个州,受欢迎程度数字4表示该水果来自4个州。所以我的桌子目前是这样的: 我需要弄清楚如何计算然

  • 这里是SQL新手。我正在尝试生成一个成本计算查询,该查询输出员工工时卡信息,并根据有效的员工成本计算率计算成本。 我的问题与这里的问题类似:追溯有效生效日期与重叠日期更改,但我不处理追溯activity或重叠日期范围。 表示例(rate表中的null值表示当前费率): 查询(返回由多个速率条目(显然)引起的dupes): 所需输出: 我在子查询中使用运算符来隔离基于计费日期的正确费率,但没有任何运

  • 我怀疑 R 有一个内置方法来做到这一点,但我是编程新手,并试图弄清楚如何手动计算日期之间的天数作为练习。这是我的代码: 我写了一个代码来确定两个日期之间的天数,使用python。我现在正在尝试将其转换为 R 以用于我正在做的另一个作业。当我运行每个单独的功能时,它们似乎工作正常。当我调用daysBetweenDates(2012,1,时,出现以下错误: 第1天出错:二进制运算符的非数字参数

  • 第一期的日期是加入日期。顾客必须分期付款。每月分期付款。因此,在11个月后,客户有资格购买产品节省的金额。因此到期日为加入之日起11个月。加入日期:2016年9月12日到期日:2017年7月12日 如果客户在预定日期或当月任何一天内付款,到期日不延长,否则到期日延长。 方案1 场景2