仅选择每个月的最新记录

时间:2014-09-24 15:25:27

标签: sql sql-server-2008 tsql

我试图编写一个查询,只允许我抓住每个月的最新记录,然后总结它们。下面是我的表的一个例子。我想要做的是选择上个月。如果我能做到这一点,我可以弄清楚如何抓住2个月前,一年前,季度等等。

如果我们在十月,我想抓住并总结一下2014年9月24日8:57的记录

我也想要写一个单独的查询来做同样的事情,但对于八月来说。

我的目标是通过声明和设置变量来完成此操作。目前我在每个where子句中使用它。我只是想弄清楚我需要做的最大(日期)部分。

DECLARE @FirstDayofPrevMonth datetime
SET @FirstDayofPrevMonth = CONVERT(DATE, DATEADD(MONTH, -1, DATEADD(DAY, 1 - DAY(GETDATE()),    
GETDATE())))
DECLARE @LastDayofPrevMonth datetime
SET @LastDayofPrevMonth = CONVERT(DATE, DATEADD(DAY, 1 - DAY(GETDATE()), GETDATE()))


DECLARE @FirstDayofPrevMonthPrior datetime
SET @FirstDayofPrevMonthPrior = dateadd(MONTH, -2,@FirstDayofPrevMonth)
DECLARE @LastDayofPrevMonthPrior datetime
SET @LastDayofPrevMonthPrior = DATEADD(MONTH,-2,@LastDayofPrevMonth)

enter image description here

更新:以下是我用作最终解决方案的内容:

SELECT SUM(NumofAccounts) AS Total
                FROM dbo.Summary
                WHERE ImportDate =  (select MAX(importdate) from AllAcctInfoSummary 
                    where year(importdate) = year(@LastDayofPrevMonth)
                    and month(importdate) = month(@LastDayofPrevMonth))
                    group by ImportDate

2 个答案:

答案 0 :(得分:2)

尝试:

select sum(some_column)
from my_table
where importdate = 
(select max(importdate) 
from my_table
where year(importdate) = 2014 
and month(importdate) = 10)
group by importdate

您可以在设置所需的年份和月份后用变量替换2014和10。上面的查询逻辑上是你想要的,你可以修改你使用的变量。您还可以使用FirstDayofPrevMonth变量并在其上调用YEAR和MONTH以获取与您的表格进行比较的正确值。

答案 1 :(得分:2)

这将为您提供每月最重要日期的总和

select ImportDate, sum(NumOfAccounts)
from mytable t1
where not exists (
    select 1
    from mytable t2 where t2.ImportDate > t1.ImportDate
    and month(t2.ImportDate) = month(t1.ImportDate)
    and year(t2.ImportDate) = year(t1.ImportDate)
) 
group by ImportDate
order by ImportDate

如果您只想上个月将以下内容添加到您的位置

and month(dateadd(month,-1,getdate())) = month(ImportDate)
and year(dateadd(month,-1,getdate())) = year(ImportDate)

使用分析函数的相同查询,应该更快一点

select ImportDate, sum(NumOfAccounts)
from (
    select *,
    rank() over (partition by month(ImportDate), year(ImportDate) order by ImportDate desc) rk
    from mytable
) t1 where rk = 1
group by ImportDate
order by ImportDate