gpt4 book ai didi

sql - 六个月内保留的参与者百分比

转载 作者:行者123 更新时间:2023-12-02 16:50:03 26 4
gpt4 key购买 nike

我是一名学校老师,对 MS SQL Server 非常陌生。每个人都建议尝试一下这个网站。开始!

我正在尝试编写查询来测试参与学术项目的不同类型的结果衡量标准。我想尝试几种不同的方法来计算这个结果测量。我试图计算的结果是:在该计划的六个月内保留的参与者百分比是多少?我正在测试定义参与者和不同时间范围的不同方法。我正在尝试生成 4 个查询。不幸的是,我必须使用不同的表:出勤、状态、取消登记、不活动。我已包含以下每个示例数据

查询

  1. 参与者的定义是从 2012 年 7 月 1 日起至 2013 年 6 月 30 日结束的 6 个月(总共 181 天)内每周至少参加两次类(class)的所有人,即会计年度的长度。如果参与者 < strong>取消注册或不活动它们被删除。
  2. 参与者的定义是自 2013 年 1 月 1 日起连续 6 个月(总共 181 天)每周至少参加两次类(class)的所有人。如果参与者取消注册或变得不活跃它们被丢弃了。
  3. 参与者的定义是从 2013 年 1 月 1 日至今每周至少参加两次类(class)的所有人
  4. 参与者的定义是学生的注册开始日期,直到他们被取消注册或变得不活跃为止。

参与者(分子)参与者/所有接受服务的学生(分母)

我正在寻找的 4 个查询输出是不同版本的:

示例

Participants    Served   Percent_Served
75 100 75%

我一直在尝试下面的不同版本的查询

 SELECT 
Count (distinct ID) as Count,
Count ( DATEADD( dd, -181, DATEADD(wk, DATEDIFF(wk,0,Date), 0)) > 2 as Participants ,
FROM Attendance
where Attendence_date date between '07/01/2012' and '06/30/2013'
and ID not in (Select ID from Inactive)
or ID not in (select ID from Deenrolled)
GROUP BY ID

 SELECT 
Count (distinct ID) as Count,
Count ( DATEADD( dd, -181, DATEADD(wk, DATEDIFF(wk,0,Date), 0)) - Enrolled_Date as Participants ,
FROM Attendance
where Attendence_date date between '07/01/2012' and '06/30/2013'
and ID not in (Select ID from Inactive)
or ID not in (select ID from Deenrolled)
GROUP BY ID

非常感谢针对这些查询的任何编程帮助。

以下是示例/示例数据集。

Attendence_date 是学生参加一门类(class)的日期。

CREATE TABLE Attendance (
ID int,
Attendence_date datetime
)

INSERT INTO Attendance VALUES
(4504498, '7/1/2012'),
(4504498, '7/2/2012'),
(4504498, '7/3/2012'),
(4504498, '7/4/2012'),
(4504498, '7/5/2012'),
(4504498, '7/8/2012'),
(4504498, '7/9/2012'),
(4504498, '7/10/2012'),
(4504498, '7/11/2012'),
(4504498, '7/12/2012'),
(4504498, '7/1/2012'),
(4504498, '7/2/2012'),
(4504498, '7/3/2012'),
(4504498, '7/4/2012'),
(4504498, '7/5/2012'),
(4504498, '7/8/2012'),
(4504498, '7/9/2012'),
(4504498, '7/10/2012'),
(4504498, '7/11/2012'),
(4504498, '7/12/2012'),
(9201052, '7/15/2012'),
(9201052, '7/16/2012'),
(9201052, '7/17/2012'),
(9201052, '7/17/2012'),
(9201052, '7/18/2012'),
(7949745, '7/17/2012'),
(7949745, '7/18/2012'),
(7949745, '7/23/2012'),
(7949745, '7/23/2012'),
(7949745, '7/24/2012'),
(7949745, '7/26/2012'),
(7949745, '7/26/2012'),
(7949745, '8/8/2012'),
(7949745, '8/8/2012'),
(7949745, '11/5/2012'),
(7949745, '11/5/2012'),
(7949745, '11/5/2012'),
(7949745, '11/6/2012'),
(7949745, '11/6/2012'),
(7949745, '11/6/2012'),
(7949745, '11/7/2012'),
(7949745, '11/7/2012'),
(7949745, '11/7/2012')

这里包含注册日期。

CREATE TABLE [Status] (
ID int,
Intake_Date datetime ,
Engaged_Date datetime ,
Enrolled_Date datetime)
INSERT INTO [Status] VALUES
(7949745, '3/7/2012', '7/17/2012', '3/8/2012'),
(4504498, '2/21/2013', '3/5/2013', '3/22/2013'),
(1486279, '4/18/2013', '5/7/2013', '5/20/2013'),
(9201052, '5/15/2012', '7/13/2012', '5/15/2012'),
(1722390, '3/5/2012', '8/27/2012', '3/8/2012'),
(7735695, '9/7/2012', '9/7/2012', '9/28/2012'),
(9261549, '3/7/2012', '7/24/2012', '3/8/2012'),
(3857008, '3/15/2013', '3/18/2013', '4/3/2013'),
(8502583, '3/14/2013', '4/15/2013', '5/3/2013'),
(1209774, '4/19/2012', '1/1/2012', '4/24/2012')

这里包含取消注册日期。

CREATE TABLE Deenrolled (
ID int,
Deenrolled_Date datetime)
INSERT INTO Deenrolled VALUES
(7949745, '2/4/2013'),
(5485272, '07/08/2013'),
(8955628, '01/10/2013'),
(5123221, '7/8/2013'),
(5774753, '7/18/2013'),
(3005451, '2/18/2013'),
(7518818, '05/29/2013'),
(9656985, '6/20/2013'),
(2438101, '7/17/2013'),
(1437052, '7/25/2013'),
(9133874, '4/25/2013'),
(7007375, '6/19/2013'),
(3178181, '5/24/2013')

并且不活跃

CREATE TABLE Inactive (
ID int,
Effect_Date datetime)
INSERT INTO Inactive VALUES
(1209774, '10/12/2012'),
(5419494, '10/12/2012'),
(4853049, '10/9/2012'),
(1453678, '5/23/2013'),
(1111554, '7/16/2012'),
(5564128, '2/15/2013'),
(1769234, '7/16/2012')

最佳答案

嗯,我应该说这不是一件容易的事。主要问题是解决“六个月内至少每周两次”部分 - 每周两次很容易计算,但应该是连续 6 个月!

当我试图解决这个问题时,我发现 Niels van der Rest 绝对出色的答案-Finding continuous ranges in a set of numbers 。因此,我将为您提供第 1 部分的一般查询,您可以更改参数并获取第 2 部分的结果:

declare @Weeks int, @PerWeek int, @StartDate date, @EndDate date, @count

select
@StartDate = '20120701',
@EndDate = '20130630',
@Weeks = 26, -- 6 month or 26 weeks
@PerWeek = 2 -- twice per week

select @count = count(distinct A.ID)
from Attendance as A
where
A.Attendence_date between @StartDate and @EndDate and
A.ID not in (select T.ID from Deenrolled as T) and
A.ID not in (select T.ID from Inactive as T)

;with CTE as (
-- Week numbers, filter by dates
select
A.ID,
datediff(dd, @StartDate, A.Attendence_date) / 7 as Wk
from Attendance as A
where
A.Attendence_date between @StartDate and @EndDate and
A.ID not in (select T.ID from Deenrolled as T) and
A.ID not in (select T.ID from Inactive as T)
), CTE2 as (
-- Group by week, filter less then @PerWeek per week, calculate row number
select
Wk, ID,
row_number() over (partition by ID order by Wk) as Row_Num
from CTE
group by Wk, ID
having count(*) >= @PerWeek
)
-- Final query - group by difference between week and row_number
select 100 * cast(count(distinct ID) as float) / @count
from CTE2
group by ID, Wk - Row_Num
having count(*) >= @Weeks

我创建了SQL FIDDLE EXAMPLE ,您可以测试该查询。

第 3 部分很简单

declare @PerWeek int, @StartDate date

select
@StartDate = '20130101',
@PerWeek = 2 -- twice per week

select @count = count(distinct A.ID)
from Attendance as A
where
A.Attendence_date >= @StartDate and
A.ID not in (select T.ID from Deenrolled as T) and
A.ID not in (select T.ID from Inactive as T)

;with CTE as (
-- Week numbers, filter by dates
select
A.ID,
datediff(dd, @StartDate, A.Attendence_date) / 7 as Wk
from Attendance as A
where
A.Attendence_date >= @StartDate and
A.ID not in (select T.ID from Deenrolled as T) and
A.ID not in (select T.ID from Inactive as T)
), CTE2 as (
-- Group by week, filter less then @PerWeek per week
select distinct ID
from CTE
group by Wk, ID
having count(*) >= @PerWeek
)
select 100 * cast(count(*) as float) / @count from CTE2

第 4 部分对我来说似乎有点不清楚,你能澄清一下吗?

关于sql - 六个月内保留的参与者百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17933622/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com