Суммарный балл между эффективным временным диапазоном в SQL базе данных сервера - PullRequest
0 голосов
/ 21 июня 2020

У меня есть следующие образцы данных в базе данных SQL сервера.

UserID Score StartDate   EndDate
------------------------------------
1      10    2019-06-01  2019-07-15
1      20    2019-06-20  2019-07-01
1      30    2019-06-17  2019-07-25
2      10    2019-05-15  2019-06-10
2      20    2019-06-15  2019-07-01
2      30    2019-06-20  2019-07-15

И мне нужно добиться следующего результата.

UserID ScoreTotal StartDate   EndDate
----------------------------------------
1      10         2019-06-01  2019-06-17
1      40         2019-06-17  2019-06-20
1      60         2019-06-20  2019-07-01
1      40         2019-07-01  2019-07-15
1      30         2019-07-15  2019-07-25
2      10         2019-05-15  2019-06-10
2      20         2019-06-15  2019-06-20
2      50         2019-06-20  2019-07-01
2      30         2019-07-01  2019-07-15

Неважно, оценка startdate или enddate включается в каждый расчет.

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Если я правильно понял, вы хотите накапливать баллы по периодам, в которых оценка постоянна. Это немного сложно, потому что может потребоваться арифметика даты c, которая зависит от базы данных. Идея состоит в том, чтобы развернуть значения и использовать функции агрегирования и окна:

with tt as (
      select userid, score, startdate as dte
      from t
      union all
      select userid, -score, enddate as dte
      from t
     ) t
select userid, sum(sum(score)) over (partition by userid order by (dte)) as score,
       dte, lead(dte) over (partition by userid order by dte)
from tt
group by userid, dte
0 голосов
/ 21 июня 2020

Предполагая, что ваше отношение A, следующий запрос выполнит нужную вам операцию:

WITH unwrapped AS (
    SELECT UserID, SUM(Score) AS Score, StartDate AS TempDate
    FROM A
    GROUP BY UserID, StartDate
    UNION ALL
    SELECT UserID, SUM(-1*Score) AS Score, EndDate AS TempDate
    FROM A
    GROUP BY UserID, EndDate
)
SELECT uw1.UserID, SUM(uw1.Score) AS ScoreTotal, MAX(uw1.TempDate) AS StartDate, uw2.TempDate AS EndDate
FROM unwrapped uw1 INNER JOIN unwrapped uw2
     ON uw1.UserID = uw2.UserID AND uw1.TempDate < uw2.TempDate
GROUP BY uw1.UserID, uw2.TempDate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...