【问题标题】:How to GROUP BY on a column with considering record sequences?如何在考虑记录序列的列上进行 GROUP BY?
【发布时间】:2015-12-13 18:35:38
【问题描述】:

对不起,我的英语不好。

我正在考虑 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 sql


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    相关资源
    最近更新 更多