Группировка определенных строк с данными на определенную дату - PullRequest
0 голосов
/ 04 сентября 2018

Есть такая таблица операций:

+----+------------+-----------+--------+---------------------------------+---------------------------------+---------------------------------+
| id | oper_date  | parent_id | amount |               p1                |               p2                |               p3                |
+----+------------+-----------+--------+---------------------------------+---------------------------------+---------------------------------+
|  1 | 01.09.2018 |         1 |      5 | p1 value at the date 01.09.2018 | p2 value at the date 01.09.2018 | p3 value at the date 01.09.2018 |
|  2 | 01.09.2018 |           |      2 | p1 value at the date 01.09.2018 | p2 value at the date 01.09.2018 | p3 value at the date 01.09.2018 |
|  3 | 02.09.2018 |         1 |      7 | p1 value at the date 02.09.2018 | p2 value at the date 02.09.2018 | p3 value at the date 01.09.2018 |
|  4 | 02.09.2018 |           |      4 | p1 value at the date 02.09.2018 | p2 value at the date 02.09.2018 | p3 value at the date 01.09.2018 |
|  5 | 02.09.2018 |           |      6 | p1 value at the date 02.09.2018 | p2 value at the date 02.09.2018 | p3 value at the date 01.09.2018 |
|  6 | 02.09.2018 |           |     10 | p1 value at the date 02.09.2018 | p2 value at the date 02.09.2018 | p3 value at the date 01.09.2018 |
|  7 | 03.09.2018 |           |      4 | p1 value at the date 03.09.2018 | p2 value at the date 03.09.2018 | p3 value at the date 01.09.2018 |
|  8 | 03.09.2018 |         1 |      3 | p1 value at the date 03.09.2018 | p2 value at the date 03.09.2018 | p3 value at the date 01.09.2018 |
|  9 | 03.09.2018 |           |      2 | p1 value at the date 03.09.2018 | p2 value at the date 03.09.2018 | p3 value at the date 01.09.2018 |
| 10 | 04.09.2018 |           |      6 | p1 value at the date 04.09.2018 | p2 value at the date 04.09.2018 | p3 value at the date 04.09.2018 |
| 11 | 04.09.2018 |         1 |      7 | p1 value at the date 04.09.2018 | p2 value at the date 04.09.2018 | p3 value at the date 04.09.2018 |
| 12 | 04.09.2018 |           |     11 | p1 value at the date 04.09.2018 | p2 value at the date 04.09.2018 | p3 value at the date 04.09.2018 |
| 13 | 04.09.2018 |           |      4 | p1 value at the date 04.09.2018 | p2 value at the date 04.09.2018 | p3 value at the date 04.09.2018 |
| 14 | 05.09.2018 |           |      8 | p1 value at the date 05.09.2018 | p2 value at the date 05.09.2018 | p3 value at the date 05.09.2018 |
| 15 | 05.09.2018 |         1 |      2 | p1 value at the date 05.09.2018 | p2 value at the date 05.09.2018 | p3 value at the date 05.09.2018 |
| 16 | 05.09.2018 |           |      6 | p1 value at the date 05.09.2018 | p2 value at the date 05.09.2018 | p3 value at the date 05.09.2018 |
+----+------------+-----------+--------+---------------------------------+---------------------------------+---------------------------------+

При извлечении строк, у которых oper_date равно <= определенной дате, это необходимо для несколько строк с одинаковым ненулевым значением поля <code>parent_id для отображения в поле amount суммы всех операций за эту дату.

В полях p1/p2/p3/id/oper_date мне нужно отобразить значения этих полей на эту дату.

Например, если я выбираю строки с помощью oper_date <= 04.09.2018, мне нужно отобразить этот результат: </p>

+----+------------+-----------+--------+---------------------------------+---------------------------------+---------------------------------+
| id | oper_date  | parent_id | amount |               p1                |               p2                |               p3                |
+----+------------+-----------+--------+---------------------------------+---------------------------------+---------------------------------+
|  2 | 01.09.2018 |           |      2 | p1 value at the date 01.09.2018 | p2 value at the date 01.09.2018 | p3 value at the date 01.09.2018 |
|  4 | 02.09.2018 |           |      4 | p1 value at the date 02.09.2018 | p2 value at the date 02.09.2018 | p3 value at the date 01.09.2018 |
|  5 | 02.09.2018 |           |      6 | p1 value at the date 02.09.2018 | p2 value at the date 02.09.2018 | p3 value at the date 01.09.2018 |
|  6 | 02.09.2018 |           |     10 | p1 value at the date 02.09.2018 | p2 value at the date 02.09.2018 | p3 value at the date 01.09.2018 |
|  7 | 03.09.2018 |           |      4 | p1 value at the date 03.09.2018 | p2 value at the date 03.09.2018 | p3 value at the date 01.09.2018 |
|  9 | 03.09.2018 |           |      2 | p1 value at the date 03.09.2018 | p2 value at the date 03.09.2018 | p3 value at the date 01.09.2018 |
| 10 | 04.09.2018 |           |      6 | p1 value at the date 04.09.2018 | p2 value at the date 04.09.2018 | p3 value at the date 04.09.2018 |
| 11 | 04.09.2018 |         1 |     22 | p1 value at the date 04.09.2018 | p2 value at the date 04.09.2018 | p3 value at the date 04.09.2018 |
| 12 | 04.09.2018 |           |     11 | p1 value at the date 04.09.2018 | p2 value at the date 04.09.2018 | p3 value at the date 04.09.2018 |
| 13 | 04.09.2018 |           |      4 | p1 value at the date 04.09.2018 | p2 value at the date 04.09.2018 | p3 value at the date 04.09.2018 |
+----+------------+-----------+--------+---------------------------------+---------------------------------+---------------------------------+

Для строки с id = 11 поле AMOUNT отображает сумму (22 = 5 + 7 + 3 + 7) значений всех строк, для которых parent_id = 1, для которых oper_date равно <= 04/09 / 2018. </p>

Как это сделать с помощью sql-запроса?

P.S. При разработке таблицы для родительской строки в поле parent_id я могу оставить значение NULL или его идентификатор.

Ответы [ 2 ]

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

Аналитическая функция Partition by будет полезна здесь. Использование Order By ID сделает сумму прогрессивной, а max id будет иметь сумму суммы. Следующее должно работать, как вы объяснили

С MY_VIEW AS (SELECT id, oper_date, parent_id, SUM (сумма) больше (разделение BY родительский_id порядок по идентификатору) AS количество, p1, p2, p3
FROM my_table WHERE parent_id не равен NULL и oper_date <= ) SELECT * FROM MY_VIEW WHERE id = (ВЫБЕРИТЕ МАКС. (Id) ОТ MY_VIEW ) союз </p>

SELECT id, oper_date, parent_id, сумма, p1, p2, p3
FROM my_table WHERE parent_id равен NULL и oper_date <= заказ по номеру </p>

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

Скажем, вы сохранили интересующую вас дату (в данном случае 04.09.2008) как @SetDate. Исходя из ожидаемого результата, я предполагаю, что вы хотите, чтобы все те записи, которые имеют значение NULL parent_id на или перед вашим @SetDate, и, в частности, для вашего @SetDate, были возвращены, и вы хотите, чтобы сумма всех сумм на и перед вашим @SetDate, где parent_id не равно NULL как отдельной записи.

SELECT id, oper_date, parent_id, amount, p1, p2, p3
FROM your_table 
WHERE parent_id IS NULL AND oper_date <= @SetDate

UNION

SELECT 
(SELECT id FROM your_table WHERE oper_date = @SetDate AND parent_id = 1 LIMIT 1) AS id, 
@SetDate AS oper_date, 
1 AS parent_id, 
(SELECT SUM(Amount) FROM your_table WHERE oper_date <= @SetDate AND parent_id = 1) AS amount,
(SELECT p1 FROM your_table WHERE oper_date = @SetDate AND parent_id = 1 LIMIT 1) AS p1,
(SELECT p2 FROM your_table WHERE oper_date = @SetDate AND parent_id = 1 LIMIT 1) AS p2,
(SELECT p3 FROM your_table WHERE oper_date = @SetDate AND parent_id = 1 LIMIT 1) AS p3
FROM your_table
...