mysql - MySQL - 按行列表中的某个值分组
问题描述
我有一个行列表,想按 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
-----------
解决方案
没有真实身份真的很难。所以我介绍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)
and 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 或更高版本
推荐阅读
- selenium-webdriver - 我们可以创建多个 webdriver 实例在一个网页中同时工作吗
- python - 如何使用python在盒子里移动机器人?
- python - Matcher 正在返回一些重复项
- neo4j - 如何从“多匹配”密码中获取所有节点
- azure - 使用 Azure PowerShell 中的两个帐户在 kubernetes 上工作
- c# - 不要等待异步方法,但 VS 会发出警告
- heroku - 为什么 Heroku 构建缓存随着每个版本的发布而变得越来越大?
- elf - 按部分过滤 GNU nm 的输出
- php - 如何使用 arg 中未知数量的参数创建用于插入/更新/删除的 PDO 类方法
- sql - 根据条件从相同列中选择单个值