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