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 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
你可以测试Here。
这仅适用于 MySQL 5.6 或更高版本
【讨论】:
以上是关于MySQL - 按行列表中的某个值分组的主要内容,如果未能解决你的问题,请参考以下文章