2017-05-31 8 views
0

Ich brauche nur die Zeile mit der höchsten Transaktionszeit pro ProductId zu bekommen. Also in diesem Fall muss ich die erste Zeile und alle anderen Zeilen mit ProductID 224 sollte weg sein. Wie kann ich das beheben? Jetzt gruppiere ich nach NQ, aber es gibt mehrere Zeilen, weil sich der NQ bei jeder Transaktion ändert. Ich kann auch keinen SUM nehmen, weil es dann alles zusammenzählt, anstatt das NQ zu dieser bestimmten Transaktionszeit zu nehmen. Hilfe ist sehrSql-Gruppe nach Funktion

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

Results

+0

Verwenden Sie Sybase oder MS SQL Server? – jarlh

+0

SELECT TOP 1 NQ, Produkt-ID, Produkt, Lager, Produkttyp, MAX (Transaktionszeit) als 'TransactionTime' FROM @MaxTime GROUP BY NQ, ProductID, Produkt, Lager, ProductType ORDER BY ProductId –

+0

Ich verwende MS SQL Server @ jarlh –

Antwort

1

Sie tun können:

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

Awesome! Danke vielmals! Es funktionierte! –

+0

Dies könnte seltsame Dinge im Falle eines Unentschiedens für die TransactionTime –

+0

@RowlandShaw tun, in der Tat, ich nahm an, dass es kein Gleichstand geben wird. Im Allgemeinen baue ich meine Abfragen so (oder mit DENSE_RANK anstatt ROW_NUMBER), denn wenn es ein Gleichstand gibt, möchte ich darüber wissen. Ich möchte nicht, dass Krawatten unbemerkt bleiben. Es kommt natürlich auf die Daten an. – HoneyBadger

0

Wie Sie sagten, durch NQ Gruppierung ist es, was Ihr Ergebnis ist los in Unordnung, weil jede Zeile einen anderen Wert hat.

Wenn Sie können davon ausgehen, dass die neuesten TransactionTime hat niedrigste NQ Wert (die mit den Beispieldaten wahr sind Sie zur Verfügung gestellten) Sie können NQ einfach entfernen group by und wählen min(NQ) statt Ebene NQ.

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

Ich fürchte, das wäre zu viel unter der Annahme, und wenn das stimmt bei Ihnen verwenden @HoneyBadger

+0

In der Tat, das geht zu viel;) Vielen Dank für Ihr Feedback, HoneyBadger Antwort ist in der Tat, was ich brauchte. –

0

Sie einen CTE verwenden könnte, so dass Sie Sie die NQ von der Get gewährleisten gleiche Zeile wie die TransactionTime, zB:

;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