4

在 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 to find just the latest one,但我不知道如何扩展它们以获取每周的结果列表。这些行可以存储在任何日期,例如可能一周内没有结果,或者一周内有 5 行,下一周有 10 行。我真的很感激一些提示。

4

3 回答 3

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

如果您使用这个MAX()版本并且您有两个相同日期的数字,那么您将返回两条记录。由于应用了 row_number 过滤器,使用该row_number()版本将仅返回一条符合条件的记录(参见演示

于 2012-10-02T14:57:44.473 回答
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;
于 2012-10-02T15:03:22.140 回答
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

于 2012-10-02T15:16:28.833 回答