mysql - 如何在考虑记录序列的情况下对列进行 GROUP BY?

标签 mysql sql

抱歉我的英语不好。

我正在尝试对一堆 user_id 进行 GROUP BY 并考虑其序列。我会尽力向您解释我到底想要什么:

表:订单

+-----------+----------+------------+
|    id     | user_id  |   amount   |
+-----------+----------+------------+
|   1       | 100      |     5      |
|   2       | 100      |     5      |
|   3       | 100      |     10     |
|   4       | 101      |     15     |
|   5       | 101      |     10     |
|   6       | 101      |     5      |
|   7       | 102      |     5      |
|   8       | 100      |     5      |
|   9       | 100      |     10     |
|   10      | 102      |     10     |
+-----------+----------+------------+

我想要的是:

+-----------+----------+------------+----------------+
| user_id   |   count  |  total_amount  |  id_range  |
+-----------+----------+------------+----------------+
|   100     |    3     |       20       |     1,3    |
|   101     |    3     |       30       |     4,6    |
|   102     |    1     |       5        |     7,7    |
|   100     |    2     |       15       |     8,9    |
|   102     |    1     |       10       |    10,10   |
+-----------+----------+------------+----------------+

到目前为止我尝试了什么:

SELECT user_id, count(user_id) as count, sum(amount) as total_amount FROM `orders` GROUP By user_id

但它只是对所有记录进行 GROUP BY,而不考虑其顺序。

最佳答案

MySQL 没有排名或行号函数,这使得答案有点复杂。要使用排名函数,请参阅此问题和答案:

http://stackoverflow.com/questions/1895110/row-number-in-mysql

一个可能的查询是这样的:

SELECT
  user_id,
  count(*) as cnt,
  sum(amount) as total_amount,
  CONCAT_WS(',', min(id), max(id)) AS id_range
FROM (
SELECT
  id,
  id - 
  CASE
    WHEN @prev_value = user_id THEN @rank_count := @rank_count + 1
    WHEN @prev_value := user_id THEN @rank_count
  END AS grp,
  user_id,
  amount
FROM
  orders CROSS JOIN (SELECT @prev_value:=NULL, @rank_count:=0) r
ORDER BY
  id
) s
GROUP BY grp

请看这个fiddle .

关于mysql - 如何在考虑记录序列的情况下对列进行 GROUP BY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34254785/

相关文章:

mysql - 如何根据多个最大日期列选择整行

mysql - liquibase 数据库从头开始构建

sql - 选择前 n 行(如果少于 n 行,则选择最后一行)

MySQL:连接三个表,比较两个值

sql - postgreSQL中的@@Fetch_status

mysql - 使用 MySQL 数据透视表时的动态 AS

mysql - ORDER BY 究竟是如何工作的?

python - 如何修复 Mac OS 上的 mysql django 连接?我已经安装了 mysqlclient 但显示 "Did you install mysqlclient?"错误

sql - PostgreSQL 序列线程上的 setval nextval 增量是否安全?

sql - SUM(CASE...) 和 CASE WHEN...THENSUM(...) 的区别