mysql - 正好对四行 sql 进行分组

标签 mysql sql

我有一个包含事务的表,其中的列包括 idcreated_atcompany_id。我想对每家公司的前四笔交易进行分组,并返回每行中每笔交易的created_at值。

换句话说,我希望输出的每一行都对应于每个公司的前四笔交易(因此按 company_id 分组),其中列显示 company_id以及这四个交易中每一个交易的created_at。

我该怎么做?

示例数据:

  id  | company_id | created_at
---------------------------------
 1123 |    abcd    | 10/12/2015
 8291 |    abcd    | 10/14/2015
 9012 |    abcd    | 10/15/2015
 9540 |    abcd    | 10/16/2015
10342 |    abcd    | 10/21/2015
10456 |    abcd    | 10/22/2015
 2301 |    efgh    | 10/13/2015
 4000 |    efgh    | 11/01/2015
 4023 |    efgh    | 11/03/2015
 6239 |    efgh    | 11/08/2015
 7500 |    efgh    | 11/14/2015

示例输出:

  company_id | created_at_1 | created_at_2 | created_at_3 | created_at_4
--------------------------------------------------------------------------
     abcd    |  10/12/2015  |  10/14/2015  |  10/15/2015  |  10/16/2015
     efgh    |  10/13/2015  |  11/01/2015  |  11/03/2015  |  11/08/2015

最佳答案

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,company_id VARCHAR(12) NOT NULL
,created_at DATE NOT NULL
);

INSERT INTO my_table VALUES
( 1123,'abcd','2015/10/12'),
( 8291,'abcd','2015/10/14'),
( 9012,'abcd','2015/10/15'),
( 9540,'abcd','2015/10/16'),
(10342,'abcd','2015/10/21'),
(10456,'abcd','2015/10/22'),
( 2301,'efgh','2015/10/13'),
( 4000,'efgh','2015/11/01'),
( 4023,'efgh','2015/11/03'),
( 6239,'efgh','2015/11/08'),
( 7500,'efgh','2015/11/14');

SELECT x.* 
  FROM my_table x 
  JOIN my_table y 
    ON y.company_id = x.company_id 
   AND y.created_at <= x.created_at 
 GROUP 
    BY x.id 
HAVING COUNT(*) <= 4 
 ORDER 
    BY company_id
     , created_at;
+------+------------+------------+
| id   | company_id | created_at |
+------+------------+------------+
| 1123 | abcd       | 2015-10-12 |
| 8291 | abcd       | 2015-10-14 |
| 9012 | abcd       | 2015-10-15 |
| 9540 | abcd       | 2015-10-16 |
| 2301 | efgh       | 2015-10-13 |
| 4000 | efgh       | 2015-11-01 |
| 4023 | efgh       | 2015-11-03 |
| 6239 | efgh       | 2015-11-08 |
+------+------------+------------+

带有变量的解决方案将会快几个数量级,例如...

SELECT a.id
     , a.company_id
     , a.created_at
  FROM 
     ( SELECT x.*
            , CASE WHEN @prev = x.company_id THEN @i:=@i+1 ELSE @i:=1 END i, @prev:=x.company_id prev 
         FROM my_table x
            , (SELECT @i:=1,@prev:=null) vars 
        ORDER 
           BY x.company_id
            , x.created_at
     ) a
 WHERE i <= 4;

关于mysql - 正好对四行 sql 进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34947833/

相关文章:

sql - 基本 SQL 用户定义函数,不能正常工作

mysql - 如何使用最新时间戳更新行

java.sql.SQL语法错误异常 : Syntax error: Encountered "(" at line

mysql - 通过多个标签选择照片

php - 修改 MYSQL 查询以仅选择特定行,用作一种索引

php - 可调整大小的表格区域 PHP

sql - postgresql 中的 NOT IN 子句

mysql - 在MySQL中获取直到上个月最后一天的数据

mysql - 具有重复项的总行数

php MySQL 实现搜索功能