Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据日期筛选最近的行_Sql_Sql Server_Sql View - Fatal编程技术网

Sql 根据日期筛选最近的行

Sql 根据日期筛选最近的行,sql,sql-server,sql-view,Sql,Sql Server,Sql View,您好,我正在使用此查询根据最近日期选择属于某个实体的物品: 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.idcabec

您好,我正在使用此查询根据最近日期选择属于某个实体的物品:

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 
我想要的结果是:

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

多谢各位

将结果查询用作创建新查询的基础

 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
您可以在artigo上使用带有分区的窗口行数函数来确定哪一个是最新的,并且只提取这些结果

;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

您可以使用如下窗口函数来实现这一点

;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 

代码可以根据您的具体需要进一步细化

那么DISTINCT呢?我假设他不需要DISTINCT操作,如果他只在每组中取最上面的项目。好的,即使在同一日期有重复的行,一行是1,另一行是2。所以不会改变结果谢谢你,这很有帮助
;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