【问题标题】:How can I specify the order of results within groups when querying Derby?查询 Derby 时如何指定组内结果的顺序?
【发布时间】:2012-09-17 23:02:31
【问题描述】:

我正在使用 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,因此它位于顶部。 然后我们将 Peter 的小组排在第二位(请注意,Peter 小组的日期“09-14”高于 Mary 小组的一个日期“09-12”但是,Peter 小组排在 Mary 小组之后,因为所有东西都应该由组的最近日期。

我已经尝试了我所知道的所有事情,但没有成功。我得到的最接近的是:

Select date_created, buyer_name 
From ORDERS 
Order By buyer_name,date_created Desc;

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

我应该在我的代码中这样做还是有更好的方法?

【问题讨论】:

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


    【解决方案1】:

    此查询将为您提供每个买家名称的最新创建日期以及您已有的结果集。如果您在 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
    

    【讨论】:

    • 感谢 Henrique 提供如此优雅的解决方案!
    • 欢迎。如果它真的对您有帮助,您可以随时点击投票箭头下方的勾号将其选为正确答案。
    【解决方案2】:

    Henrique,感谢您提供如此优雅的解决方案。在发布问题之前我已经尝试了至少 3 天。

    现在,我有了一个新的。当我尝试对每页 3 个条目的查询进行分页时,我在第一页和第二页中都得到了 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); 
    

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

    再次感谢你的时间,阿曼多

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多