【问题标题】:MySQL - group by certain value in the list of rowsMySQL - 按行列表中的某个值分组
【发布时间】: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 我已经编辑了这个问题。之前说的不对,抱歉。

标签: mysql database presto


【解决方案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 或更高版本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 2014-07-24
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2020-02-24
    • 2018-06-12
    相关资源
    最近更新 更多