我正在使用Derby数据库。
我有一张这样的表:
TB_ORDERS
BUYER_NAME DATE_CREATED OTHER_COLLUMS ......
---------------------------------------------
DAVID 2012-09-01 ----
PETER 2012-09-14 ----
DAVID 2012-09-05 ----
PETER 2012-09-02 ----
DAVID 2012-08-15 ----
MARY 2012-09-02 ----
MARY 2012-09-15 ----
我正在尝试按BUYER_NAME分组结果,其中每个组应按DATE_CREATED排序,最后按照组的最新日期排序,如下所示:
MARY 2012-09-15
MARY 2012-09-12
PETER 2012-09-14
PETER 2012-09-02
DAVID 2012-09-05
DAVID 2012-09-01
DAVID 2012-08-15
正如您所看到的,Mary's Group拥有最新的date_created,因此它被置于顶部。 然后我们得到彼得的小组第二名(注意彼得的小组的日期“09-14”高于玛丽小组“09-12”的一个日期,然而,彼得的小组被放置在玛丽的小组之后,因为每件事都应该由小组最近的约会。
我已经尝试过所有我知道但没有成功的事情。我得到的最接近的是:
Select date_created, buyer_name
From ORDERS
Order By buyer_name,date_created Desc;
但是,这些组不按最近的组日期排序。
我应该在我的代码中执行此操作还是有更好的方法?
答案 0 :(得分:1)
此查询将为您提供每个buyer_name的最新date_created,以及您已有的结果集。如果在Order By子句中包含这个新列,它应该可以解决这个问题:
Select o.date_created, o.buyer_name,
(select max(date_created) from orders where buyer_name = o.buyer_name) as most_recent_date
From ORDERS o
Order By most_recent_date, o.buyer_name, o.date_created Desc
答案 1 :(得分:0)
Henrique,谢谢你这么优雅的解决方案。在发布问题之前,我已经尝试了至少3天。
现在,我有一个新的。当我尝试将查询分页为每页3个itens时,我在第一页中获得Petter,在第二页中再次获得Petter。为了解决这个问题,我使用一个子查询,我选择按买家分组的所有不同的date_created,这就是我的分页。有用。但是,它并不像你的那样优雅高效。 这是我糟糕的解决方案(我添加了一个新行“WHERE”):
Select o.date_created, o.buyer_name,
(select max(date_created) from orders where buyer_name = o.buyer_name) as most_recent_date
From ORDERS o
where buyer_name in (SELECT buyer_name FROM ORDERS WHERE date_created in (SELECT MAX(date_created) FROM ORDERS GROUP BY buyer_name ORDER BY 1 DESC OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY))
Order By most_recent_date, o.buyer_name, o.date_created ASC
PS: the resultset shows the oldest date first and for that I am using a
Collections.reverse(list);
知识是好的,但想象力更好。
再次请你的时间,阿曼多