2017-02-21 45 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

相關問題