2012-02-16 122 views
0

表1如下:寻找最近一个月,一年,包括其他领域

Name Number Month Year Fee_Paid 
Ravi 1  1  2010 100 
Raju 2  1  2010 200 
Kumar 3  1  2010 300 
Ravi 1  2  2011 100 
Raju 2  2  2011 200 
Kumar 3  2  2011 300 
Ravi 1  3  2012 100 
Raju 2  3  2012 200 
Kumar 3  3  2012 300 

结果应该是如下:

Name Number Month Year Fee_Paid 
Ravi 1  3  2012 100 
Raju 2  3  2012 200 
Kumar 3  3  2012 300 

结果应该显示最新的年份和月份,包括名称,该期间的号码和费用_付款。请帮助我。

+0

请描述结果你想要什么,如果有你的样本数据多了一个一行:'库马尔4 4 2013 350' ... – 2012-02-16 05:24:46

回答

1

这是一种非CTE解决方案:

select HighestYear.* from (
    select v1.* from visitors v1 
    left join visitors v2 
    on v1.number = v2.number and v1.year < v2.year 
    where v2.year is null 
) HighestYear 
left join visitors v3 
on HighestYear.number = v3.number and HighestYear.year = v3.year 
and HighestYear.month < v3.month 
where v3.month is null 

Example with more data

+0

请注意,你有5个额外的列都是空的(我认为你需要'HighestYear。*'vs.'*')。即使这样看起来好像你的整个左连接是不必要的 - 查询返回完全相同的结果。我不相信他们是正确的结果 - 很难说他是否希望找到上个月的所有行,或者找到每个用户的最后一个月。这似乎只是一个巧合,每个用户在上个月都有一行。 – 2012-02-16 05:38:45

+0

嗨,我刚刚添加了一个例子。我不确定哪些是您提到的那些额外的列。 – 2012-02-16 05:44:33

+0

尝试在SQL Server中运行它(例如Management Studio)。我不知道那些小提琴手正在做什么,但它忽略了来自别名副本作为v3的所有列。另请注意,如果删除年份= 2012年和月份= 4的示例行之一会发生什么情况。年份= 2012和月= 3的行应该在那里吗?我猜测没有,但我们必须等待我猜测的OP反应。 – 2012-02-16 05:46:51

1

如果你想在最后一行每一个名字,不管哪个月是他们最后个月:

;WITH x AS 
(
    SELECT Name, Number, [Month], [Year], [Fee_Paid], 
     rn = ROW_NUMBER() OVER 
     (PARTITION BY Name ORDER BY [Year] DESC, [Month] DESC) 
    FROM dbo.Table1 
) 
SELECT Name, Number, [Month], [Year], [Fee_Paid] 
FROM x 
WHERE rn = 1 
ORDER BY Number; 

如果希望所有从去年年/月组合的行发现,无论名称,该查询只略有不同:

;WITH x AS 
(
    SELECT Name, Number, [Month], [Year], [Fee_Paid], 
     rn = DENSE_RANK() OVER (ORDER BY [Year] DESC, [Month] DESC) 
    FROM #x 
) 
SELECT Name, Number, [Month], [Year], [Fee_Paid] 
FROM x 
WHERE rn = 1 
ORDER BY Number; 

这两个查询得到的结果你似乎后,但其中一人只有巧合的是可能是正确的。

0
SELECT 
    Details.Name, 
    Details.Number, 
    Details.Month, 
    Details.Year, 
    Details.Fee_Paid 
FROM 
    (
    SELECT 
     Name, 
     MAX(Year) AS Year, 
     MAX(Month) AS Month 
    ) AS MaxValues 
INNER JOIN MyTable AS Details ON 
    Details.Name = MaxValues.Name 
    AND Details.Year = MaxValues.Year 
    AND Details.Month = MaxValues.Month