Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 分组并检索表中每个组的最新条目_Sql - Fatal编程技术网

Sql 分组并检索表中每个组的最新条目

Sql 分组并检索表中每个组的最新条目,sql,Sql,首先,如果我没有正确陈述SQL问题,请容忍我 我有一个包含多列数据的表。基于第1列(顺序#)的“我的表”组的选择标准。每个订单上可能有多个项目,但项目未分组在一起 例如: Order Customer Order Date Order Time Item Quantity 123456 45 01/02/2010 08:00 140 4 123456 45 0

首先,如果我没有正确陈述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项

这可能吗


python

因为您没有指定哪个数据库产品或版本,所以我将展示一个适用于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]
       )

后一种解决方案的一个特点是,如果有多行具有相同的订单、客户、项目、订单日期和订单时间,您将在上述输出中获得多行。

由于您没有提及,我假设您使用的是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;

分享并享受。

Bob的答案看起来不错,但从阅读查询结果来看,它似乎想要的是数量列的最大值,而不是总和,这意味着将“总和(数量)”聚合表达式更改为“最大(数量)”。

根据预期结果,我看不到使用的是总和。不是Oracle。我正试图从Macola表构建SQL视图。@天哪,小马们-你说得对-我读错了。更改为MAX,实际上仍然需要进一步更正,因为不能保证MAX(ORDER\u TIMESTAMP)的行与MAX(QUANTITY)的行相对应,但我现在就不考虑它了。关于MAX(ORDER\u TIMESTAMP)和MAX(QUANTITY)行,您是完全正确的。如果数量严格增加,那么我们就可以了,前提是客户不能退货,或者没有撤销购买的设施。