2017-05-31 80 views
0

我只需要获得每个productId具有最高事务时间的行。所以在这种情况下,我需要获得第一行,并且所有其他与productid 224的行应该消失。我怎样才能解决这个问题?现在我按NQ分组,但是有多条线路,因为NQ每次交易都会改变。我也不能接受一个SUM,因为那样会增加一切,而不是在某个交易时间取得NQ。帮助深表感谢按功能划分的sql组

SELECT NQ, ProductId, Product, Warehouse, ProductType, MAX(Transactiontime) as 'TransactionTime' 
FROM @MaxTime 
GROUP BY NQ, Productid, Product, Warehouse, ProductType 
ORDER BY ProductId 

Results

+0

您是使用Sybase还是MS SQL Server? – jarlh

+0

SELECT'TOP1 NQ,ProductId,Product,Warehouse,ProductType,MAX(Transactiontime)as'TransactionTime' FROM @MaxTime GROUP BY NQ,Productid,Product,Warehouse,ProductType ORDER BY ProductId –

+0

我正在使用MS SQL Server @ jarlh –

回答

1

你可以这样做:

SELECT MT.NQ, MT.ProductId, MT.Product, MT.Warehouse, MT.ProductType, MT.Transactiontime 
FROM @MaxTime MT 
INNER JOIN (
       SELECT ProductId 
       ,  MAX(Transactiontime) AS 'TransactionTime' 
       FROM @MaxTime 
       GROUP BY Productid 
      ) GR 
     ON MT.ProductId = GR.ProductId 
     AND MT.TransactionTime = GR.TransactionTime 
ORDER BY MT.ProductId 
+0

太棒了!非常感谢!有效! –

+0

这可能会在TransactionTime –

+0

@RowlandShaw并列的情况下发生奇怪的事情,实际上,我认为这不会是平局。一般来说,我建立这样的查询(或使用DENSE_RANK而不是ROW_NUMBER),因为如果有一条平局,我想知道它。我不想让领带不被人注意。当然,这一切都取决于数据。 – HoneyBadger

0

正如你所说,通过NQ分组是什么搞乱你的结果了,因为每一行都有不同的价值。

如果可以假设最新TransactionTime具有最低NQ值(这与您提供的样本数据真实),你只需删除从group byNQ并选择min(NQ)而不是纯NQ

SELECT min(NQ), ProductId, Product, Warehouse, ProductType, MAX(Transactiontime) as 'TransactionTime' 
FROM @MaxTime 
GROUP BY Productid, Product, Warehouse, ProductType 
ORDER BY ProductId 

恐怕会假设太多,如果这是真的,你将不得不使用@HoneyBadger回答

+0

事实上,这是假设太多;)感谢您的反馈,HoneyBadger的答案确实是我需要的。 –

0

你可以使用一个CTE,这样就保证你从一开始的NQTransactionTime相同,例如:

;WITH Data AS (
    SELECT  NQ, 
       ProductId, 
       Product, 
       Warehouse, 
       ProductType, 
       TransactionTime, 
       ROW_NUMBER() OVER (PARTITION BY Productid, Product, Warehouse, ProductType ORDER BY TransactionTime DESC) AS rn 

    FROM  @MaxTime 
) 
SELECT  NQ, 
      ProductId, 
      Product, 
      Warehouse, 
      ProductType, 
      TransactionTime 

FROM  Data 

WHERE  rn = 1 

ORDER BY ProductId