2017-05-31 122 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