在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行。我真的很感激这方面的一些提示。
答案 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
如果您使用此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