2016-07-20 5 views
1

Hallo ich diese Abfrage bin mit Artikel auswählen zu einer Einheit gehören, basierend auf dem jüngsten Datum:Filter der letzten Zeile, auf dem Datum basieren

SELECT DISTINCT ld.artigo, 
       cd.data, 
       cd.entidade, 
       cd.tipodoc, 
       cd.numdoc 
FROM cabecdoc AS cd 
INNER JOIN linhasdoc AS ld 
     ON cd.id = ld.idcabecdoc 
INNER JOIN cabecdocstatus AS cds 
     ON ld.idcabecdoc = cds.idcabecdoc 
WHERE cd.tipodoc = 'FAR' 
     AND ld.artigo IS NOT NULL 
     AND cds.estado <> 't;r' 
ORDER BY cd.data DESC 

Lassen Sie uns asume, die ich habe dieses Ergebnis

Artigo Entidade   Data 
Tr01 002    10-07-2015 
Tr01 003    9-10-2015 
Mn09 001    11-12-2016 
Jk90 009    12-07-2016 
Tr01 012    4-09-2016 

Das Ergebnis ich suche, ist dies:

Artigo     entidade        data 
Mn09      0001         11-12-2016 
Jk90      0009        2-07-2016 
Tr01      0012        4-09-2016 

Thank you very much!

Antwort

1

Sie eine ROW_NUMBER() Funktion mit einem auf dem artigoPARTITION Fenster verwenden zu erstellen, die man zu bestimmen, ist die jüngste, und nur die Ergebnisse ziehen.

;With Cte As 
(
    SELECT ld.artigo 
     ,cd.data 
     ,cd.entidade 
     ,cd.tipodoc 
     ,cd.numdoc 
     ,Row_Number() Over (Partition By ld.artigo Order By cd.data desc) As Seq 
    FROM CabecDoc AS cd 
    INNER JOIN LinhasDoc AS ld ON cd.id = ld.IdCabecDoc 
    INNER JOIN CabecDocStatus AS cds ON ld.IdCabecDoc = cds.IdCabecDoc 
    WHERE cd.TipoDoc = 'FAR' 
     AND ld.Artigo IS NOT NULL 
     AND cds.Estado <> 't;r' 
) 
Select artigo, entidade, data 
From Cte 
Where Seq = 1 
+0

was ist mit der ' DISTINKT? –

+0

Ich würde annehmen, dass er die "DISTINCT" -Operation nicht benötigt, wenn er nur den obersten Gegenstand pro Gruppe nimmt. – Siyual

+0

Ok, auch wenn es Duplikate Zeilen am gleichen Datum gibt, wird eins 1 und die anderen 2. So ändert sich nicht Ergebnis –

0

Ihr Ergebnis Abfrage als Basis verwenden, um eine neue

SELECT Artigo, Entidade, Data 
FROM ( 
     SELECT *, ROW_NUMBER() OVER (PARTITION BY Artigo ORDER BY Data DESC) as rn 
     FROM YourQuery YQ 
    ) T 
WHERE T.rn = 1 
+0

Dank auf Ihre genauen Bedürfnisse basiert verfeinert werden können, half viel –

0

Sie diese Funktionen durch die Verwendung Fenster erreichen können, wie unten

;WITH CTE AS (
SELECT DISTINCT ld.artigo, 
       cd.data, 
       cd.entidade, 
       cd.tipodoc, 
       cd.numdoc 
FROM cabecdoc AS cd 
INNER JOIN linhasdoc AS ld 
     ON cd.id = ld.idcabecdoc 
INNER JOIN cabecdocstatus AS cds 
     ON ld.idcabecdoc = cds.idcabecdoc 
WHERE cd.tipodoc = 'FAR' 
     AND ld.artigo IS NOT NULL 
     AND cds.estado <> 't;r' 
), CTE1 AS 
(
SELECT *,ROW_NUMBER() OVER(PARTITION BY Artigo,entidade order by data desc) as RN 
FROM CTE 
) 
SELECT * 
FROM CTE1 
WHERE rn = 1 

Der Code weiter

für die Antwort
+0

verwenden 'ctrl-K' oder fügen Sie 4 Leerzeichen zu formatieren als' code ' –

+0

Danke, es hat viel geholfen –

Verwandte Themen