我试图通过“group by”从表中选择行,并忽略按日期对数据排序得到的第一行。排序应通过日期字段完成,以忽略最新条目并返回组的旧条目。
表格看起来像
+----+------------+-------------+-----------+
| id | updated on | group_name | list_name |
+----+------------+----------------+--------+
| 1 | 2013-04-03 | g1 | l1 |
| 2 | 2013-03-21 | g2 | l1 |
| 3 | 2013-02-26 | g2 | l1 |
| 4 | 2013-02-21 | g1 | l1 |
| 5 | 2013-02-20 | g1 | l1 |
| 6 | 2013-01-09 | g2 | l2 |
| 7 | 2013-01-10 | g2 | l2 |
| 8 | 2012-12-11 | g1 | l1 |
+----+------------+-------------+-----------+
http://www.sqlfiddle.com/#!2/cec99/1
所以,基本上,我只想返回 ids (3,4,5,6,8),因为它们是 group_name 和 list_name 中最旧的。忽略最新条目并通过根据 group_name 和 list_name 进行分组来返回旧条目
我无法为这个问题编写sql。我知道 order by 不能与 group by 一起使用。请帮我找出解决方案。
谢谢
还有,有没有办法在不使用子查询的情况下做到这一点?
最佳答案
类似于以下内容,仅获取特定行的最小日期的行:
select a.ID, a.updated_on, a.group_name, list_name
from data a
where
a.updated_on <
(
select max(updated_on)
from data
group by group_name having group_name = a.group_name
);
SQL fiddle :http://www.sqlfiddle.com/#!2/00d43/10
更新(根据您的要求)
select a.ID, a.updated_on, a.group_name, list_name
from data a
where
a.updated_on <
(
select max(updated_on)
from data
group by group_name, list_name having group_name = a.group_name
and list_name = a.list_name
);
参见:http://www.sqlfiddle.com/#!2/cec99/3
更新(不使用相关子查询而是使用简单子(monad)查询)
根据: Subqueries vs joins 确定相关子查询太慢
因此我改为连接基于嵌套查询的别名临时表。
select a.ID, a.updated_on, a.group_name, a.list_name
from data a,
(
select group_name, list_name , max(updated_on) as MAX_DATE
from data
group by group_name, list_name
) as MAXDATE
where
a.list_name = MAXDATE.list_name AND
a.group_name = MAXDATE.group_name AND
a.updated_on < MAXDATE.MAX_DATE
;
SQL fiddle :http://www.sqlfiddle.com/#!2/5df64/8
关于Mysql 选择行分组依据并按另一列排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16836693/