mysql - 从组中选择最旧的两条记录

标签 mysql sql group-by greatest-n-per-group

我发现了很多示例,展示了如何从分组集中选择单个最旧/最新的行,但是我无法从数据集中获取最旧的两行。

这是我的示例表:

CREATE TABLE IF NOT EXISTS `orderTable` (
  `customer_id` varchar(10) NOT NULL,
  `order_id` varchar(4) NOT NULL,
  `date_added` date NOT NULL,
  PRIMARY KEY (`customer_id`,`order_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `orderTable` (`customer_id`, `order_id`, `date_added`) VALUES
('1234', '5A', '1997-01-22'),
('1234', '88B', '1992-05-09'),
('0487', 'F9', '2002-01-23'),
('5799', 'A12F', '2007-01-23'),
('1234', '3A', '2009-01-22'),
('3333', '7FHS', '2009-01-22'),
('0487', 'Z33', '2004-06-23'),
('3333', 'FF44', '2013-09-11'),
('3333', '44f5', '2013-09-02');

此查询返回多于两行:

SELECT customer_id, order_id, date_added
FROM orderTable T1
WHERE (
   select count(*) FROM orderTable T2
   where T2.order_id = T1.order_id AND T2.date_added <= T1.date_added
) <= 2;

因为我不是在寻找单行,所以这不是标准的 greatest-n-per-group 类型查询。

我错过了什么,我可以获得每个 customer_id 的前两个订单?

最佳答案

最好(即最高效)的方法是在查询中使用用户定义的变量。

SELECT tmp.customer_id, tmp.date_added 
FROM ( 
  SELECT 
    customer_id, date_added, 
    IF (@prev <> customer_id, @rownum := 1, @rownum := @rownum+1 ) rank,
    @prev := customer_id
  FROM orderTable t 
  JOIN (SELECT @rownum := NULL, @prev := 0) r 
  ORDER BY t.customer_id
) tmp 
WHERE tmp.rank <= 2 
ORDER BY customer_id, date_added

结果:

| CUSTOMER_ID |                       DATE_ADDED |
|-------------|----------------------------------|
|        0487 |   January, 23 2002 00:00:00+0000 |
|        0487 |      June, 23 2004 00:00:00+0000 |
|        1234 |       May, 09 1992 00:00:00+0000 |
|        1234 |   January, 22 1997 00:00:00+0000 |
|        3333 |   January, 22 2009 00:00:00+0000 |
|        3333 | September, 02 2013 00:00:00+0000 |
|        5799 |   January, 23 2007 00:00:00+0000 |

fiddle here .

请注意,连接只是用于初始化变量。

关于mysql - 从组中选择最旧的两条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18795551/

相关文章:

MySQL 5.6 InnoDB count、group by、having 和 order by 返回错误结果

mysql - 带空值的 COUNT(),在子查询内

mysql - SQL查询获取当前数据60天后到期日期的数据

从 bash 脚本运行查询时 MySQL 复制不起作用

MySQL - 只获取记录哪些用户ID在一列中有两个特定的不同值

sql - Postgresql 按重叠时间分组

php - 如何插入 3 个 php 数组值作为 3 个 MYSQL 列

Mysql更改字段中的id是另一个字段= "transfer"

mysql - 这是什么样的主键?

带有 GROUP BY 子句的 COUNT 的 MySQL SUM