2

我正在尝试通过“分组依据”从表中选择行,并忽略通过按日期对数据进行排序获得的第一行。排序应按日期字段完成,以忽略最新条目并返回组的旧条目。

桌子看起来像

+----+------------+-------------+-----------+
| 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

所以,基本上,我只想返回 id (3,4,5,6,8),因为它们是 group_name 和 list_name 中最旧的。忽略最新条目并通过基于 group_name 和 list_name 分组返回旧条目

我无法为这个问题编写 sql。我知道 order by 不适用于 group by。请帮助我找出解决方案。

谢谢

而且,有没有办法在不使用子查询的情况下做到这一点?

4

3 回答 3

2

类似于以下内容的仅获取特定行的最短日期的行:

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 小提琴: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

更新(不使用相关子查询,但使用简单子查询)

决定相关子查询太慢基于:子查询与连接

所以我改为加入基于嵌套查询的别名临时表。

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 小提琴:http ://www.sqlfiddle.com/#!2/5df64/8

于 2013-05-30T13:05:13.780 回答
0

您可以尝试使用以下查询(是的,它有一个嵌套连接,但也许有帮助)。

SELECT ID FROM 
(select d1.ID FROM data d1 LEFT JOIN 
data d2 ON (d1.group_name = d2.group_name AND d1.list_name=d2.list_name AND 
d1.updated_on > d2.updated_on) WHERE d2.ID IS NULL) data_tmp;

更正:

SELECT DISTINCT(ID) FROM 
(select d1.* FROM data d1 LEFT JOIN 
data d2 ON (d1.group_name = d2.group_name AND d1.list_name=d2.list_name AND 
d1.updated_on < d2.updated_on) WHERE d2.ID IS NOT NULL) date_tmp;
于 2013-05-30T13:23:57.677 回答
0
SELECT DISTINCT y.id 
  FROM data x 
  JOIN data y 
    ON y.group_name = x.group_name 
   AND y.list_name = x.list_name 
   AND y.updated_on < x.updated_on;
于 2013-06-04T21:12:49.580 回答