2017-02-21 44 views
1

我有一个表是这样的:获取每周最多日期的记录表中​​的

date  | data 
----------------- 
1/1/2017 | a 
----------------- 
1/2/2017 | b 
----------------- 
1/3/2017 | c 
----------------- 
1/7/2017 | d 
----------------- 
... 
----------------- 
2/2/2017 | a 
----------------- 
2/2/2017 | b 
----------------- 

我需要获得最大的日期数据为表每周可。日期可以多次提交,某些日期可能会丢失,并且几周可能不会在七天内添加。

第一,可能是想到的最简单的方法是这样的:

select maxdate, data from (
select max(date) as maxdate from mytable group by DATEPART(wk, date) 
) t1, maytable 
where mytable.date = t1.date 

但有人告诉我,有没有使用max函数更好的解决方案。这甚至可能吗?上面有没有更好的方法?

这是一个假设性问题,上述查询可能不是100%正确的,因为我没有测试过它。

回答

0

使用common table expression (cte)row_number()你可以得到的最后日期和相关的列,每星期,像这样:

使用row_number()将让得到的只是一排每个星期的最后[date]。如果需要[date]是本周最后一天的所有行,则可以使用rank()dense_rank()而不是row_number()

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

或不CTE像这样:

select * 
from (
    select * 
    , rn = row_number() over (
     partition by datepart(week,[date]) 
     order by [date] desc) 
    from mytable 
) as cte 
where rn = 1 
+0

感谢的人,为什么没有这个,我想起?顺便说一句,比使用聚合函数更好的性能吗? – Lamar

+0

@Lamar我真的不知道它是否会表现更好,您将不得不测试每个数据。虽然我相信这将执行单个索引扫描,而不是您的其他查询的两个索引扫描(或索引扫描+索引查找)(因为您在[日期]上使用函数,所以您将无法使用索引查找在[日期] max()查询)...但我真的不能确定没有看到两者的执行计划。 – SqlZim

+0

反正谢谢你。 – Lamar

相关问题