Sql server 查找最近月份、年份(包括其他字段)

Sql server 查找最近月份、年份(包括其他字段),sql-server,sql-server-2005,Sql Server,Sql Server 2005,表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

表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

结果应显示最近的一年和一个月,包括姓名、号码和在此期间支付的费用。请帮助我。

如果您想要每个姓名的最后一行,无论其最后一个月是哪个月:

;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;

这两个查询都给出了您想要的结果,但其中一个可能只是巧合地正确无误。

这是一个非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

请描述如果示例数据中还有一行,您希望得到什么结果:Kumar 4 4 2013 350…请注意,您有5个额外的列全部为空,我认为您希望获得最高年份。*vs.*。即使这样,似乎整个左连接都是不必要的-查询返回完全相同的结果,而没有它。而且我不相信它们是正确的结果——很难说他是希望找到上个月的所有行,还是希望找到每个用户的上个月的行。似乎只是巧合,每个用户在上个月都有一行。嗨,我刚刚添加了一个示例。我不确定您提到的那些额外的专栏。请尝试在SQL Server中运行它,例如Management Studio。我不知道fiddler在做什么,但它忽略了visitors副本中别名为v3的所有列。还要注意,如果删除其中一个年=2012、月=4的示例行,会发生什么。是否应该存在年=2012、月=3的行?我猜不会,但我想我们必须等待OP响应。对不起,我在Linux中,所以我无法测试。关于month=3的列,我认为它应该在那里。我同意等待OP:Update:得到了关于专栏副本的信息,你说得对!它替换了它们,因为它有相同的名称,而我忘记了更新它。
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