MySQL условное агрегирование текста - PullRequest
0 голосов
/ 31 мая 2018

В настоящее время у меня есть следующая модель для ввода:

+---------+-----------+---------+---------+--------+
| user_id |   date    | program |  type   |  more  |
+---------+-----------+---------+---------+--------+
|       1 | 23-Mar-15 | AAA     | init    |        |
|       1 | 21-May-15 | AAA     | 1/3     |        |
|       1 | 22-Sep-15 | AAA     | 1/3     |        |
|       1 | 20-Mar-16 | AAA     | 1/3     |        |
|       1 | 12-Aug-16 | CCC     | init    |        |
|       1 | 27-Jun-18 | CCC     | init    | refund |
|       2 | 16-May-16 | BBB     | init    |        |
|       2 | 12-Aug-16 | BBB     | full    |        |
|       2 | 15-Mar-17 | AAA     | 1/3     |        |
|       2 | 21-Jun-17 | AAA     | 1/3     | refund |
|       3 | 24-May-18 | BBB     | init    |        |
|       3 | 27-May-18 | BBB     | 1/3     |        |
|       3 | 27-Jun-18 | BBB     | 2/3     |        |
|       4 | 27-Jun-18 | AAA     | init    |        |
|       5 | 27-Jun-18 | AAA     | 1/3     |        |
|       5 | 27-Jun-18 | AAA     | 1/3     |        |
+---------+-----------+---------+---------+--------+

Результат, который я ищу:

+---------+----------+------------+
| user_id | programs | aggregated |
+---------+----------+------------+
|       1 | AAA      | full       |
|       1 | CCC      | refund     |
|       2 | BBB      | full       |
|       2 | AAA      | refund     |
|       3 | BBB      | 2/3        |
|       4 | AAA      | init       |
|       5 | AAA      | 2/3        |
+---------+----------+------------+

Я ищу совет о том, как создать таблицу ввода, которая будетвозможность получить запрошенный результат.В предыдущих итерациях у меня было десятки различных опций для каждой программы, но я нашел этот подход совершенно бесполезным.Поэтому я значительно упростил возможные типы программ.Но все же я не вижу, как я мог бы объединить данные, используя этот вход.Если я слишком глуп, чтобы увидеть, что уже возможно получить искомый результат из существующего ввода, пожалуйста, укажите мне направление.

Вопрос TL: DR - агрегация, которую я ищу, возможна / жизнеспособна, используямоя текущая таблица ввода в MySQL?- если нет, какую модификацию вы бы посоветовали в моей таблице ввода?- если да, просьба указать мне правильное направление.

РЕДАКТИРОВАТЬ

Попытаться описать логику более подробно:

каждый пользователь может иметь несколькопрограммы

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

программа AAA имеет только следующие параметры ввода init, 1/2, 1/3 или полная возможность вэтот ряд (я не имею на это никакого влияния).

другие программы имеют: 1/2, 2/2, 1/3, 2/3, 3/3, полное, init

каждая программа может иметь один из следующих типов состояний как результат : инициализация, 1/2, 1/3, 2/3, полное, возврат

псевдокод:

For every program that user has:
 If there is only one type for a program then result = that type.   
 If there is more than one type of program: 
   check if there are any refund    
    if every program type has refund, then result = refund  
    if there are program type without refund, result = aggregated   
    if there are no refunds, then result = aggregated

1 Ответ

0 голосов
/ 31 мая 2018
SELECT user_id, program,
    CASE 
        WHEN COUNT(DISTINCT type) = 1 THEN MAX(type) -- one type, use that type
        WHEN SUM(more = 'refund') = COUNT(DISTINCT type) THEN 'refund'
        WHEN SUM(IF(LOCATE('/', type), SUBSTRING_INDEX(type, '/', 1), 0)) >= 3 THEN 'full'
        WHEN MAX(LOCATE('/', type)) > 0 THEN CONCAT(SUM(IF(LOCATE('/', type), SUBSTRING_INDEX(type, '/', 1), 0)), '/3')
        ELSE MAX(type)
    AS aggregated
FROM yourTable
GROUP BY user_id, program

ДЕМО

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