Wie

2016-03-25 12 views
-1

mehrere Zeilen basierend auf max Datum erhalte ich eine Tabelle SalePrices in SQL Server und Daten wie unten:Wie

SPID  ProductID  Price  Date 
001   Pro01   10  2016-03-10 
002   Pro01   20  2016-03-11 
003   Pro02   10  2016-03-13 
004   Pro02   20  2016-03-15 

Was ich will ist eine Ansicht erstellen, die nur eine ProductID und Preis zeigen, dass ich zum letzten Mal geändert. Also, was ich will, ist gleich dem Ergebnis unter:

ProductID Price Date 
Pro01  20  2016-03-11 
Pro02  20  2016-03-15 

Antwort

2

Es sind einige verschiedene Ansätze für diese, beispielsweise mit row_number():

;with cte as (
    select 
     ProductID, Price, Date, 
     row_number() over(partition by ProductID order by Date desc) as rn 
    from <Table> 
) 
select 
    ProductID, Price, Date 
from cte 
where 
    rn = 1 

sql fiddle demo

0

TRY DIESE:

SELECT 
     ProductID 
    , Price 
    , Date FROM tablename AS A 
JOIN (SELECT ProductID,MAX(Date) AS DATE FROM tablename 
    GROUP BY ProductID 
) AS B ON A.Date=B.DATE AND A.ProductID=B.ProductID 
+2

dies funktionieren wird , aber nur, wenn keine doppelten Daten pro ProductID in der Tabelle vorhanden sind. Natürlich ist es nicht klar, was wir im Falle von Duplikaten sowieso zeigen sollten, aber nur für Info –

+0

datetime wird den Trick – SnakeFoot

1

Eine andere Version mit Fensterfunktionen, diese mit FIRST_VALUE();

SELECT ProductID, price, date 
FROM products 
WHERE spid IN (
    SELECT FIRST_VALUE(spid) OVER (PARTITION BY ProductID ORDER BY date DESC) spid 
    FROM products 
) 

An SQLfiddle to test with.

Beachten Sie, dass die Version von Roman mit ROW_NUMBER von SQL Server 2005 und neuer funktionieren sollte, während dies nur für SQL Server 2012 und neuer funktioniert.

0

ein weiterer Ansatz ...

select productid,price,date 
from 
table t1 
where date=(select max(date) from table t2 where t1.productid=t2.productid) 
0

Ihre letzte Platte die höchsten SPID hat:

select 
    ProductId, Price, Date 
from 
    SalePrices sap 
where 
    sap.spid =(
    select 
    max(sap2.spid) 
    from 
    SalePrices sap2 
    where 
    sap2.productId = sap.productId) 

Diese Abfrage gibt u gewünschtes Ergebnis:

ProductID Price Date 
Pro01  20  2016-03-11 
Pro02  20  2016-03-15 
+0

Kein Fenster funktioniert, und kein Problem, wenn mehrere Datensätze das gleiche Datum haben, wird der letzte Datensatz von max SPID berücksichtigt gruppiert nach Produkt-ID – Justas