2016-07-20 1 views
1

Salut je suis en utilisant cette requête pour sélectionner l'article appartenant à une entité en fonction de la date la plus récente:filtre la ligne la plus récente, en se basant sur la date

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 

Asume de Let que j'ai ce résultat

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 

Le résultat que je cherche est la suivante:

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

Merci beaucoup!

Répondre

1

Vous pouvez utiliser une fonction ROW_NUMBER() fenêtré avec un PARTITION sur le artigo afin de déterminer lequel est le plus récent, et seulement tirer ces résultats.

;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

quid du ' DISTINCT'? –

+0

Je suppose qu'il n'aurait pas besoin de l'opération 'DISTINCT' s'il ne prend que le premier élément par groupe. – Siyual

+0

Ok, même s'il y a des doublons à la même date, l'un sera 1 et l'autre 2. Donc, ne change pas le résultat –

0

Utilisez votre requête de résultat en tant que base pour créer une nouvelle

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

merci pour la réponse, aidé beaucoup –

0

Vous pouvez y parvenir en utilisant des fonctions de fenêtre comme ci-dessous

;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 

Le code peut être affiné en fonction de vos besoins exacts

+0

d'utiliser 'ctrl-K' ou d'ajouter 4 espaces pour formater en tant que' code ' –

+0

Merci, ça a beaucoup aidé –