Расчет изменения в столбце по группам и извлечение на основе критериев - PullRequest
0 голосов
/ 26 сентября 2018

Я новичок в кодировании в U-SQL / C #.Я застрял в каком-то месте во время работы с окнами / агрегации.

Мои данные выглядят как

Name          Date                  OrderNo    Type   Balance
one 2018-06-25T04:55:44.0020987Z      1        Drink     15       
one 2018-06-25T04:57:44.0020987Z      1        Drink     70      
one 2018-06-25T04:59:44.0020987Z      1        Drink     33       
one 2018-06-25T04:59:49.0020987Z      1        Drink     25       
two 2018-06-25T04:55:44.0020987Z      2        Drink     22       
two 2018-06-25T04:57:44.0020987Z      2        Drink     81       
two 2018-06-25T04:58:44.0020987Z      2        Drink     33       
two 2018-06-25T04:59:44.0020987Z      2        Drink     45       

В U-SQL я добавляю уникальный идентификатор, основанный на комбинациях имени, порядкового номера, типа идля сортировки я добавляю еще одну, включая дату.

@files = 
EXTRACT
        name string,
        date DateTime,
        type string,
        orderno int,
        balance int           
FROM
@InputFile
USING new JsonExtractor();

@files2 =
    SELECT *,
       DENSE_RANK() OVER(ORDER BY name,type,orderno,date) AS group_id,
       DENSE_RANK() OVER(ORDER BY name,type,orderno) AS id
     FROM @files;

Мои данные теперь выглядят так:

Name          Date                  OrderNo    Type   Balance group_id id
one 2018-06-25T04:55:44.0020987Z      1        Drink     15       1     1
one 2018-06-25T04:57:44.0020987Z      1        Drink     70       2     1
one 2018-06-25T04:59:44.0020987Z      1        Drink     33       3     1
one 2018-06-25T04:59:49.0020987Z      1        Drink     25       4     1
two 2018-06-25T04:55:44.0020987Z      2        Drink     22       5     2
two 2018-06-25T04:57:44.0020987Z      2        Drink     81       6     2
two 2018-06-25T04:58:44.0020987Z      2        Drink     33       7     2
two 2018-06-25T04:59:44.0020987Z      2        Drink     45       8     2

(я добавил только 4 записи на группу, ноих несколько на группу)

Я застрял в определении разницы между последовательными строками в столбце balance в каждой группе .

Ожидаемый результат для части 1:

Name          Date                  OrderNo    Type   Balance group_id id  increase
one 2018-06-25T04:55:44.0020987Z      1        Drink     15       1     1    0
one 2018-06-25T04:57:44.0020987Z      1        Drink     70       2     1    55
one 2018-06-25T04:59:44.0020987Z      1        Drink     33       3     1   -37
one 2018-06-25T04:59:49.0020987Z      1        Drink     25       4     1   -8
two 2018-06-25T04:55:44.0020987Z      2        Drink     22       5     2    0
two 2018-06-25T04:57:44.0020987Z      2        Drink     81       6     2    59
two 2018-06-25T04:58:44.0020987Z      2        Drink     33       7     2   -48
two 2018-06-25T04:59:44.0020987Z      2        Drink     45       8     2    8

Для каждой новой группы (определенной по id) увеличение должно начинаться с нуля.

Я прошел через переполнение стека и увиделфункция запаздывания от transgresql.Я не мог найти эквивалент C #.Это применимо в этом случае?

Любая помощь приветствуется.При необходимости будут предоставлены дополнительные разъяснения.

Обновление: когда я использую CASE, когда мое решение выглядит следующим образом

CURRENT OUTPUT                            DESIRED OUTPUT
id Balance Increase                     id  Balance Increase
 1  15      0                            1  15      0
 1  70     55                            1  70     55
 1  33    -37                            1  33    -37
 1  25     -8                            1  25     -8
 2  22    "-3"                           2  22     "0"
 2  81     59                            2  81     59
 2  33    -48                            2  33    -48
 2  45     12                            2  45     12

Посмотрите на выделенную строку.Столбец увеличения должен начинаться с 0 для каждого идентификатора.

Обновление: мне удалось решить первую часть моего вопроса.Смотрите мой ответ ниже.Вторая часть, которую я выложил ранее, была неправильно опубликована.Я удалил это.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Запрос, который наконец-то сработал для меня, был следующим:

@files = 
EXTRACT
        name string,
        date DateTime,
        type string,
        orderno int,
        balance int           
FROM
@InputFile
USING new JsonExtractor();

@files2 =
SELECT *,
       DENSE_RANK() OVER(ORDER BY name,type,orderno) AS group_id
FROM @files;

@files3 =
SELECT *,
       DENSE_RANK() OVER(PARTITION BY group_id ORDER BY date) AS group_order
FROM @files2;


@files4 =
SELECT *,
     (CASE WHEN group_order == 1 THEN 0 
         ELSE  balance  - LAG(balance) OVER(ORDER BY name,type,orderno) 
    END) AS increase 
FROM @files3;
0 голосов
/ 26 сентября 2018

Вы можете попытаться использовать LAG оконную функцию, чтобы получить предыдущий Balance в подзапросе, затем используйте where, чтобы написать условие.

SELECT * FROM (
    SELECT *,
       DENSE_RANK() OVER(ORDER BY name,type,orderno,date) AS group_id,
       DENSE_RANK() OVER(ORDER BY name,type,orderno) AS id,
       (CASE WHEN LAG(Balance) OVER(ORDER BY name,type,orderno) IS NULL THEN 0 
             ELSE  Balance  - LAG(Balance) OVER(ORDER BY name,type,orderno) 
        END) as increase 
    FROM @files
) t1
WHERE increase > 50
...