为每个组分组和检索表中的最新条目

时间:2010-05-24 19:13:14

标签: sql

首先,如果我没有正确陈述SQL问题,请耐心等待。

我有一个包含多列数据的表。我的表组的选择标准基于第1列(订单号)。每个订单上可能有多个项目,但项目#不会组合在一起。

示例:

Order     Customer     Order Date     Order Time     Item     Quantity  
123456    45           01/02/2010     08:00          140       4  
123456    45           01/02/2010     08:30          270      29  
123456    45           03/03/2010     09:00          140       6  
123456    45           04/02/2010     09:30          140      10  
123456    45           04/02/2010     10:00          270      35  

我需要的是如下结果:

Order     Customer     Order Date     Order Time     Item     Quantity  
123456    45           04/02/2010     09:30          140       10  
123456    45           04/02/2010     10:00          270       35  

此结果显示,在所有更改之后,最终订单包括项目140中的10项和项目270中的35项。

这可能。

3 个答案:

答案 0 :(得分:1)

既然你没有提到它,我会假设你使用的是Oracle:

SELECT ORDER, CUSTOMER, ITEM, MAX(ORDER_TIMESTAMP), MAX(QUANTITY)
  FROM (SELECT ORDER,
               CUSTOMER,
               ITEM,
               TO_DATE(TO_CHAR(ORDER_DATE, 'YYYY-MM-DD') || ' ' ||
                       TO_CHAR(ORDER_TIME, 'HH:MI:SS'), 'YYYY-MM-DD HH:MI:SS')
                 AS ORDER_TIMESTAMP,
               QUANTITY
          FROM MY_TABLE)
  GROUP BY ORDER, CUSTOMER, ITEM;

分享并享受。

答案 1 :(得分:0)

由于您没有指定哪个数据库产品或版本,我将展示一个适用于SQL Server 2005或更高版本的解决方案:

With RankedItems As
 (
 Select Order, Customer, [Order Date], [Order Time], Item, Quantity
  , Row_Number() Over( Partition By Order, Customer, Item Order By [Order Date] Desc, [Order Time] Desc ) As Num
 From Table
 )
Select Order, Customer, [Order Date], [Order Time], Item, Quantity
From RankedItems
Where Num = 1

这是一个与数据库无关的解决方案:

Select T.Order, T.Customer, T.[Order Date], T.[Order Time], T.Item, T.Quantity
From Table As T
Where T1.[Order Date] = (
      Select Max(T1.[Order Date])
      From Table As T1
      Where T1.Order = T.Order
       And T1.Customer = T.Customer
       And T1.Item = T.Item
      )
 And T1.[Order Time] = (
       Select Max(T1.[Order Time])
       From Table As T1
       Where T1.Order = T.Order
        And T1.Customer = T.Customer
        And T1.Item = T.Item
        And T1.[Order Date] = T.[Order Date]
       )

此后续解决方案中的问题是,如果有多个行具有相同的订单,客户,项目,订单日期和订单时间,您将在上面的输出中获得多行。

答案 2 :(得分:0)

鲍勃的回答看起来不错,但是从阅读查询看起来想要的是数量列的最大值而不是总和,这意味着将“SUM(QUANTITY)”聚合表达式更改为“MAX(QUANTITY)” ”