Рассчитать разницу строк в группах - PullRequest
1 голос
/ 18 марта 2019

Мне нужна помощь в расчете разницы между последовательно упорядоченными строками в группах в SQL (сервер Microsoft SQL).

У меня есть такая таблица:

ID   School_ID   Enrollment_Start_Date   Order
1        56            1/1/2018            10
1        56            5/5/2018            24
1        56            7/7/2018            35  
1       103            4/4/2019            26
1       103            3/3/2019            19

Я хочу рассчитать разницу между Order, group по ID, School_ID и order по Enrollment_Start_Date.

поэтому я хочу что-то вроде этого:

ID   School_ID   Enrollment_Start_Date   Order  Diff
1        56            1/1/2018            10    10 # nothing to be subtracted from 10
1        56            5/5/2018            24    14 # 24-10
1        56            7/7/2018            35    11 # 35-24
1       103            3/3/2019            19    19 # nothing to be subtracted from 19
1       103            4/4/2019            26    7 # 26-19

У меня есть сотни идентификаторов, и каждый идентификатор может иметь не более 6 Enrollment_Start_Date, поэтому я ищу некоторые обобщающие реализации.

Ответы [ 3 ]

2 голосов
/ 18 марта 2019

Используйте аналитическую функцию LAG(<column>), чтобы получить «предыдущее» значение столбца, указанное в части OVER, затем вычесть из него текущее значение и сделать его положительным числом, умножив его на -1.Если предыдущее значение отсутствует (равно нулю), тогда принимается текущее значение.

Псевдокод будет:

If previous_order_value exists:
  -1 * (previous_order_value - current_order_value)
Else
  current_order_value

, где previous_order_value основан на том жеid & school_id и сортируется по enrollment_start_date в порядке возрастания

Код SQL:

select
    id,
    school_id,
    enrollment_start_date,
    [order],
    coalesce(-1 * (lag([order]) over (partition by id, school_id order by enrollment_start_date ) - [order]), [order]) as diff
from yourtable

Также обратите внимание, что ключевое слово order зарезервировано в SQL Server, чтоВот почему ваш столбец был создан с именем, заключенным в [ ].Я предлагаю использовать другое слово для этого столбца, если это возможно.

1 голос
/ 18 марта 2019

используйте lag() аналитическую функцию для получения разности двух строк и случай, когда для получения оригинального значения столбца заказа, где нет разницы

    with cte as
(
select 1 as id, 56 as sclid, '2018-01-01' as s_date, 10 as orders
union all
select 1,56,'2018-05-05',24 union all
select 1,56,'2018-07-07',35 union all
select 1,103,'2019-04-04',26 union all
select 1,103,'2019-03-03',19 
) select t.*, 
case when ( lag([orders])over(partition by id,sclid order by s_date ) -[orders] )
 is null then [orders] else
  ( lag([orders])over(partition by id,sclid order by s_date ) -[orders] )*(-1) end
  as diff
 from cte t

выход

id  sclid   s_date   orders diff
1    56   2018-01-01    10  10
1    56   2018-05-05    24  14
1    56   2018-07-07    35  11
1    103  2019-03-03    19  19
1   103   2019-04-04    26  7

демонстрационная ссылка

0 голосов
/ 18 марта 2019

Использовать LAG (COLUMN_NAME)

Запрос

SELECT id, School_ID, Enrollment_Start_Date, cOrder,
ISNULL((cOrder - (LAG(cOrder) OVER(PARTITION BY id, School_ID ORDER BY Enrollment_Start_Date))),cOrder)Diff
FROM Table1

Вывод Samle

| id | School_ID | Enrollment_Start_Date | cOrder | Diff |
|----|-----------|-----------------------|--------|------|
|  1 |        56 |            2018-01-01 |     10 |   10 |
|  1 |        56 |            2018-05-05 |     24 |   14 |
|  1 |        56 |            2018-07-07 |     35 |   11 |
|  1 |       103 |            2019-03-03 |     19 |   19 |
|  1 |       103 |            2019-04-04 |     26 |    7 |

Демонстрация SQL Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...