MySQL - группировка по определенному значению в списке строк - PullRequest
1 голос
/ 24 июня 2019

У меня есть список строк, и я хочу сгруппировать их по идентификатору и определенному начальному значению. (Скажите значение = 1 в приведенном ниже примере)

Группировка по значению

Набор строк - MySQL & Presto

-----------
ID | value
-----------
A  | 1
A  | 2
B  | 1
B  | 2
B  | 5
B  | 1
B  | 2
C  | 1
C  | 3
C  | 4
C  | 1
D  | 1
D  | 8
D  | 1
-----------

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

-----------
ID | Value
-----------
A  | 1,2
B  | 1,2,5
B  | 1,2
C  | 1,3,4
C  | 1
D  | 1,8
D  | 1
-----------

Фактический объем производства:

-----------
ID | Value
-----------
A  | 1,2
B  | 1,2,5,1,2
C  | 1,3,4,1
D  | 1,8,1
-----------

1 Ответ

1 голос
/ 25 июня 2019

Без реального идентификатора действительно сложно.Поэтому я ввожу rowNumber:

SELECT (@row := @row + 1) AS rowNumber, ID,value
FROM myTable
CROSS JOIN (SELECT @row := 0) AS dummy

Затем я добавляю 2 столбца с max Value:

 SELECT a.*
 FROM customTable as a
 LEFT OUTER JOIN myTable b ON a.id = b.id AND a.value < b.value
 WHERE b.id IS NULL

После этого мне нужно использовать group_concat(value) и group by.Group by имеет 2 условия, id и другое пользовательское логическое поле:

CASE 
   WHEN l1.rowNumber <= l2.rowNumber THEN 0
   ELSE 1
END

ЗАКЛЮЧИТЕЛЬНЫЙ ЗАПРОС:

SELECT ct1.id, group_concat(ct1.value) as Value
FROM (
         SELECT (@cnt := @cnt + 1) AS rowNumber, ID, value
         FROM myTable
         CROSS JOIN (SELECT @cnt := 0) AS dummy
     ) AS ct1
JOIN (
    SELECT a.*
    FROM (
             SELECT (@row := @row + 1) AS rowNumber, ID, value
             FROM myTable
             CROSS JOIN (SELECT @row := 0) AS dummy
         ) AS a
    LEFT OUTER JOIN myTable b ON a.id = b.id AND a.value < b.value
    WHERE b.id IS NULL
) AS ct2 ON ct2.ID = ct1.id
GROUP BY ct1.id,
         CASE
             WHEN ct1.rowNumber <= ct2.rowNumber THEN 0
             ELSE 1
         END

Вы можете проверить Здесь.

Это работает только с MySQL 5.6 или выше

...