2016-12-05 45 views
0

我覺得這個問題不算太壞,但我一直在尋找一個大部分時間無法解決的問題。我見過很多其他解決方案似乎並不能幫助我獲得不是唯一值的列以及group by和aggregate函數。在一列上聚合函數,在另一列上聚合函數,讓第三列不受影響

問題

我有歷史數據的表如下:

ID | source | value | date 
---+--------+-------+----------- 
1 | 12  | 10 | 2016-11-16 
2 | 12  | 20 | 2015-11-16 
3 | 12  | 30 | 2014-11-16 
4 | 13  | 40 | 2016-11-16 
5 | 13  | 50 | 2015-11-16 
6 | 13  | 60 | 2014-11-16 

我試圖讓在某個日期之前的數據(在循環中去不同的範圍),然後獲取按來源分組的值的總和。例如「在30天前獲得所有記錄,並獲取唯一來源的值的總和,並使用每個記錄的最新日期條目」。

所以第一步是刪除不在範圍內的日期條目,一個簡單的where date < getdate()-30例如獲得:

ID | source | value | date 
---+--------+-------+----------- 
2 | 12  | 20 | 2015-11-16 
3 | 12  | 30 | 2014-11-16 
5 | 13  | 50 | 2015-11-16 
6 | 13  | 60 | 2014-11-16 

現在我的問題是找到一種方法來group by源,並採取max日期,然後對所有來源的結果進行總結。我們聽到的想法是,我們不知道最後一次輸入是什麼時候,所以在指定日期之前我們會得到所有記錄,然後爲每個唯一的源採取最新的輸入項,然後求和這些輸入以獲得當時的總值。

因此,下一步將使用日期的最大值,從而可以對組由源:

ID | source | value | date 
---+--------+-------+----------- 
2 | 12  | 20 | 2015-11-16 
5 | 13  | 50 | 2015-11-16 

然後在最後一步將是值相加,然後重複這個過程中得到多個日期的總和值,所以這將導致行

value | date 
-------+----------- 
70 | getdate() - 30 

其餘的使用。

當我被困

我想GROUP BY source和使用的date最大,以獲取最新的每一個獨特的source項,但如果我使用聚合函數或group by ,那麼我不能保留IDvalue列以堅持選定的最大行。這完全有可能,我只是誤解了聚合函數的工作原理。

迄今取得的進展

我已經得到了最好的地方,卻是一樣的東西

with dataInDateRange as (
    select * 
    from #historicalData hd 
    where hd.date < getdate() - 30 
) 
select ???, max(date) 
from dataInDateRange 
group by source 

但我沒有看到我怎麼能做到這一點不以某種方式保存的唯一ID每個source的最大date的那一行,然後我可以回去總結這些數字。

謝謝你偉大的人民任何幫助/引導/教訓

回答

2

使用row_number()

with dataInDateRange as (
    select * 
    from #historicalData hd 
    where hd.date < getdate() - 30 
), rows as (
    select *, 
      row_number() over (partition by source 
           order by date desc) as rn 
    from dataInDateRange 
) 
SELECT * 
FROM rows 
WHERE rn = 1 
+0

看起來行之有效!我通過做'從行中選擇不同的源代碼'來檢查並獲得相同數量的行。好的解決方案,我會解釋我對自己和其他任何可能會在這裏結束的理解,任何更正將不勝感激! 第一個select獲取所需範圍內的數據,然後我們對這些數據進行處理,並對每個'source'進行一些分割,然後對'date'進行排序,然後在該小分組內記錄行號以查看哪一個是第一個,然後在'rn'中找到。 –

+1

是的,這是正確的。只需檢查文檔https://msdn.microsoft.com/es-es/library/ms186734.aspx, –

+1

順便說一句,你可以合併前兩個查詢在一個單一的。我只是爲了便於閱讀而分開。 –