прерванный временной ряд - преобразование данных - SQL Сервер - PullRequest
0 голосов
/ 09 июля 2020

Я использую Microsoft SQL Server 2012, и у меня есть 2 вопроса, если вы можете помочь.

У меня есть 2 основные таблицы:

Individual  Age  Gender
    1       66     1
    2       33     0
    3       72     1

Individual Appointment_Date Clinic
    1         10-12-2018      A 
    1         05-03-2019      A  
    1         31-08-2019      A 
    2         02-12-2018      A  
    2         16-03-2019      A  
    2         12-04-2019      A   
    2         16-05-2019      A 
    3         07-12-2018      B  
    3         12-05-2019      B 
    3         19-06-2019      B 

Я хотел бы запустить прерванный анализ временных рядов, чтобы понять влияние вмешательства на показатель результатов c. У меня нет этой метрики результатов c, мне нужно оценить ее за неделю, используя Total_Appointments. Я рассчитал Total_Appointments на человека за все время, как:

SELECT T1.Individual, COUNT(DISTINCT T2.Appointment_Date) AS [TOTAL_APPOINTMENTS]
FROM T1 LEFT JOIN T2
     ON T1.Individual = T2.Individual AND
        T2.APPOINTMENT_DATE > '2018-12-01' AND
        T2.APPOINTMENT_DATE < '2019-08-31'

Вопрос 1: Как я могу оценить Total_Appointments на человека и за неделю ? Это промежуточный шаг, который мне нужно выполнить, но я получу результат metri c, агрегированный на уровне clini c.

Затем мне также нужно будет преобразовать другие переменные (Avg_Age , Avg_Gender) на регулярные интервалы времени, например:

Date_start   Date_end   Weeks_passed Clinic Outcome Avg_Age Avg_Gender Intervention_occurs
2018-12-02   2018-12-08       1         A      0.1      63      0.7           0
2018-12-02   2018-12-08       1         B      0.3      66      0.5           0
2018-12-02   2018-12-08       1         C      0.2      67      0.6           0
2018-12-09   2018-12-15       2         A      0.2      64      0.7           0
2018-12-09   2018-12-15       2         B      0.4      65      0.6           0
2018-12-09   2018-12-15       2         C      0.3      66      0.6           0
2018-12-16   2018-12-22       3         A      0.3      64      0.7           0
2018-12-16   2018-12-22       3         B      0.3      65      0.6           0
2018-12-16   2018-12-22       3         C      0.4      66      0.6           0
2018-12-23   2018-12-29       4         A      0.5      64      0.7           1
2018-12-23   2018-12-29       4         B      0.2      65      0.6           1
2018-12-23   2018-12-29       4         C      0.3      66      0.6           1
2018-12-30   2019-01-05       5         A      0.6      64      0.7           1
2018-12-30   2019-01-05       5         B      0.5      65      0.6           1
2018-12-30   2019-01-05       5         C      0.3      66      0.6           1
2019-01-06   2019-01-12       6         A      0.6      64      0.7           1
2019-01-06   2019-01-12       6         B      0.5      65      0.6           1
2019-01-06   2019-01-12       6         C      0.3      66      0.6           1

Это исследование началось с 02.12.2018 (воскресенье) по 31.08.2019 (суббота).

Вопрос 2: Подскажите, пожалуйста, как создать такую ​​таблицу временных рядов на сервере SQL? Затем я импортирую его в R и провожу фактический анализ там.

1 Ответ

0 голосов
/ 10 июля 2020

Для части 1 сделайте это так:

with t as (
select 1 individual, cast('20181210' as date) date, 'A' clinic union all
select 1 individual, cast('20190305' as date) date, 'A' clinic union all
select 1 individual, cast('20190831' as date) date, 'A' clinic union all
select 2 individual, cast('20181202' as date) date, 'A' clinic union all
select 2 individual, cast('20190316' as date) date, 'A' clinic union all
select 2 individual, cast('20190412' as date) date, 'A' clinic union all
select 2 individual, cast('20190516' as date) date, 'A' clinic union all
select 3 individual, cast('20181207' as date) date, 'B' clinic union all
select 3 individual, cast('20190512' as date) date, 'B' clinic union all
select 3 individual, cast('20190619' as date) date, 'B' clinic 
), t1 as (
select *, cast(datepart(year, date) as char(4)) + cast(datepart(week, date) as char(2)) yearweek from t
)
select count(distinct date) cnt, individual, yearweek from t1 group by individual, yearweek

Он создает столбец yearweek, который использует datepart, чтобы иметь возможность группировать по неделям.

Теперь я можно создать весь список с аналитическими функциями вместо группировки по. Есть небольшая проблема, потому что Microsoft Sql не разрешает count(distinct column) over (partition by ...) - я использую обходной путь для этого, используя дважды dense_rank() over (...). Я также добавил столбец начала недели и столбца конца недели. Как и раньше, я использую CTE, чтобы сначала создать данные примера, а затем выполнить требуемые изменения:

with t as (
select 1 individual, cast('20181210' as date) date, 'A' clinic union all
select 1 individual, cast('20190305' as date) date, 'A' clinic union all
select 1 individual, cast('20190831' as date) date, 'A' clinic union all
select 2 individual, cast('20181202' as date) date, 'A' clinic union all
select 2 individual, cast('20190316' as date) date, 'A' clinic union all
select 2 individual, cast('20190412' as date) date, 'A' clinic union all
select 2 individual, cast('20190516' as date) date, 'A' clinic union all
select 2 individual, cast('20190514' as date) date, 'A' clinic union all--new row to demonstrate count-distinct
select 3 individual, cast('20181207' as date) date, 'B' clinic union all
select 3 individual, cast('20190512' as date) date, 'B' clinic union all
select 3 individual, cast('20190619' as date) date, 'B' clinic 
), t1 as (
select *, cast(datepart(year, date) as char(4)) + cast(datepart(week, date) as char(2)) yearweek,
dateadd(day,   -((5 + DATEPART(dw, date) + @@DATEFIRST) % 7), date) start_of_week,
dateadd(day,  7-((5 + DATEPART(dw, date) + @@DATEFIRST) % 7), date) end_of_week
 from t
)
select dense_rank() over (partition by individual, yearweek order by date) + dense_rank() over (partition by individual, yearweek order by date desc) - 1 cnt_distinct, 
individual, yearweek, start_of_week, date, end_of_week
from t1 
order by yearweek, individual
...