查询Derby时,如何指定组内结果的顺序?

时间:2012-09-17 23:02:31

标签: sql group-by sql-order-by derby

我正在使用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;

但是,这些组不按最近的组日期排序。

我应该在我的代码中执行此操作还是有更好的方法?

2 个答案:

答案 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); 

知识是好的,但想象力更好。

再次请你的时间,阿曼多