Получить детали первого и последнего экземпляра из таблицы MySQL в R - PullRequest
0 голосов
/ 28 марта 2020

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

Table1:

ID    Initial_Date          Updated_Date         Sequence      Value_1   Value_2   Value_3   Value_4
I-1   2020-03-01 15:12:33   2020-03-01 15:12:33  1             10000     ABC       1.000     2.000
I-1   2020-03-01 15:12:33   2020-03-02 12:09:03  2             15000     xyz       1.500     3.000
I-2   2020-03-02 10:19:03   2020-03-02 10:19:03  1             11000     xyz       2.000     3.000
I-2   2020-03-02 10:19:03   2020-03-04 19:19:36  2             10000     ABC       1.000     3.000
I-2   2020-03-02 10:19:03   2020-03-05 10:12:43  1             15000     ABC       1.500     1.000
I-3   2020-03-01 15:12:33   2020-03-01 15:12:33  1             10000     ABC       1.000     2.000

Используя вышеупомянутую таблицу, мне нужно получить начальные и конечные значения на основе Sequence против каждый ID и хочет определить, какие значения изменились между начальной и конечной записью.

Где F_Value - это окончательное значение для этого prticular id. Day_diff - Разница дней между Initial_Date и Final_Date в выходных данных.

Требуемый вывод:

ID      Initial_Date         Final_Date           Day_diff   Count  Value_1  F_Value_1 Value_2   F_Value_2  Value_3 F_Value_3 Value_4  F_Value_4 
I-1     2020-03-01 15:12:33  2020-03-02 12:09:03  1          2      10000    15000     ABC       xyz        1.000   1.500     2.000     3.000
I-2     2020-03-02 10:19:03  2020-03-05 10:12:43  3          3      11000    15000     xyz       ABC        2.000   1.500     3.000     3.000
I-3     2020-03-01 15:12:33  2020-03-01 15:12:33  0          1      10000    10000     ABC       ABC      1.000    1.000    2.000     2.000

1 Ответ

0 голосов
/ 28 марта 2020

В MySQL 8+ вы можете использовать row_number(), чтобы назначить номер каждой строке, разделенной на id. Как только число соответствует порядку по sequence по возрастанию - первая строка для идентификатора получает 1 -, а при уменьшении последней строки по идентификатору получается 1. Поместите это в две производные таблицы, которые вы затем объедините на общих id и row_number(). В предложении WHERE фильтр для row_number() равен 1. (Если sequence гарантированно начинается с 1, вы также можете использовать sequence напрямую вместо row_number() в порядке возрастания sequence, так как оба значения 1 для первой строки.)

Чтобы получить счет, вы можете использовать оконную версию count(), разделенную на id.

datediff(), чтобы получить день между первой и последней строкой id.

SELECT x1.id,
       x1.initial_date,
       x2.updated_date final_date,
       datediff(x2.updated_date, x1.initial_date) day_diff,
       x1.c count,
       x1.value_1,
       x2.value_1 f_value_1,
       x1.value_2,
       x2.value_2 f_value_2,
       x1.value_3,
       x2.value_3 f_value_3,
       x1.value_4,
       x2.value_4 f_value_4
       FROM (SELECT id,
                    initial_date,
                    count(*) OVER (PARTITION BY id) c,
                    value_1,
                    value_2,
                    value_3,
                    value_4,
                    row_number() OVER (PARTITION BY id
                                       ORDER BY sequence ASC) rn
                    FROM table1) x1
            INNER JOIN (SELECT id,
                               updated_date,
                               value_1,
                               value_2,
                               value_3,
                               value_4,
                               row_number() OVER (PARTITION BY id
                                                  ORDER BY sequence DESC) rn
                               FROM table1) x2
                       ON x2.id = x1.id
                          AND x2.rn = x1.rn
       WHERE x1.rn = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...