MySQL - 按行列表中的某个值分组

Posted

技术标签:

【中文标题】MySQL - 按行列表中的某个值分组【英文标题】:MySQL - group by certain value in the list of rows 【发布时间】:2019-11-06 06:08:17 【问题描述】:

我有一个行列表,想按 ID 和某个起始值对它们进行分组。 (在下面给出的示例中说 value=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
-----------

【问题讨论】:

输入数据与预期/实际输出不匹配。请参阅输入数据中的 id:B,值:3。输出中没有这样的值。 您使用的是哪个 MySQL 版本? @KamilGosciminski 我已经编辑了这个问题。之前说的不对,抱歉。 【参考方案1】:

没有真实身份真的很难。所以我介绍rowNumber

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

然后我添加 2 列最大 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 byGroup 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

你可以测试Here。

这仅适用于 MySQL 5.6 或更高版本

【讨论】:

以上是关于MySQL - 按行列表中的某个值分组的主要内容,如果未能解决你的问题,请参考以下文章

Flutter如何根据某个值从firebase对列表进行分组

快速回顾MySQL:汇总和分组

快速回顾MySQL:汇总和分组

mysql查询某个值在分组中出现多次的数据

mysql 分组总和求最大值 的两种方式

MySQL 使用 INTERVAL() 函数 实现数据按区间分组