SQL查询列出每周的最新行

时间:2012-10-02 14:55:23

标签: sql-server tsql group-by

在SQL Server中,我有以下数据,我想每周获取最新一行。

我有下表。 WW(日期的周数)列不存在,只是日期,我把它放在那里更好地解释查询的目的。

Number  Date          WW
392     2012-07-23    30
439     2012-07-24    30
735     2012-07-25    30
882     2012-07-26    30 *
193     2012-07-30    31
412     2012-07-31    31   
425     2012-08-01    31
748     2012-08-02    31
711     2012-08-03    31 *
757     2012-08-07    32
113     2012-08-08    32 *
444     2012-08-15    33 *

查询的理想结果应为

882     30 
711     31 
113     32 
444     33 

基本上我想要得到的是每周的最新一行。我找到了这样的例子Get the records of last month in SQL server 找到最新的一个,但我不知道如何扩展它们以获得每周的结果列表。行可以存储在任何日期,例如可能在一周内没有结果,或者在一周内有5行,下一周有10行。我真的很感激这方面的一些提示。

3 个答案:

答案 0 :(得分:7)

你应该能够使用这样的东西:

select t1.number, t2.ww
from yourtable t1
inner join
(
    select max(date) mxdate, datepart(week, [Date]) ww
    from yourtable 
    group by datepart(week, [Date])
) t2
    on t1.date = t2.mxdate
    and datepart(week, t1.[Date]) = t2.ww;

或者您可以使用CTE

;with cte as
(
  select number, datepart(week, [Date]) ww,
    row_number() over(partition by datepart(week, [Date]) 
                      order by date desc) rn
  from yourtable
)
select number, ww
from cte
where rn = 1

请参阅SQL Fiddle with Demo

如果您使用此MAX()版本并且您有两个具有相同日期的数字,那么您将返回两条记录。使用row_number()版本只会返回一条符合条件的记录,因为应用了row_number过滤器(请参阅Demo

答案 1 :(得分:3)

如果您使用的是sql server,可以这样做:

declare @test table(Number int, Date datetime, WW int);

INSERT INTO @test
    (Number, Date, WW)
VALUES
    (392, '2012-07-22 17:00:00', 30),
    (439, '2012-07-23 17:00:00', 30),
    (735, '2012-07-24 17:00:00', 30),
    (882, '2012-07-25 17:00:00', 30),
    (193, '2012-07-29 17:00:00', 31),
    (412, '2012-07-30 17:00:00', 31),
    (425, '2012-07-31 17:00:00', 31),
    (748, '2012-08-01 17:00:00', 31),
    (711, '2012-08-05 17:00:00', 31),
    (757, '2012-08-06 17:00:00', 32),
    (113, '2012-08-07 17:00:00', 32),
    (444, '2012-08-14 17:00:00', 33)

SELECT * FROM (
select number, date, ww,
row_number() over (partition by ww order by date desc) rn
from @test) v
WHERE rn = 1;

答案 2 :(得分:1)

这可以通过相关的子查询来完成,如下所示:

SELECT number, [date]
FROM tablename T
WHERE NOT EXISTS (
    SELECT 1
    FROM tablename
    WHERE DATEPART(wk, [date]) = DATEPART(wk, T.[date])
        AND date > T.[date]
)

请注意,这不会返回2012-08-06,因为我认为这实际上是在一年中的第32周http://www.wolframalpha.com/input/?i=6th+August+2012

相关问题