2016-03-02 43 views
0

給定以下代表性示例表;根據部分數據計算SQL排名

Id SupplierID Amount  Time 
----------------------------------------------------------------- 
1  1    99.50  2016-02-17 13:19:21.4107347 +00:00 
2  1    99.00  2016-02-17 15:00:40.1052771 +00:00 
3  2    98.00  2016-02-17 15:07:07.6283091 +00:00 
4  1    95.00  2016-02-17 16:40:08.4895886 +00:00 
5  3    94.50  2016-02-17 16:40:18.7326269 +00:00 
6  2    92.00  2016-02-17 16:40:44.0902749 +00:00 
----------------------------------------------------------------- 

我想弄清楚每個供應商的排名對每條記錄在表。因此,對於[Time]的每個實例,我希望爲每個在該時間點或之前具有表格條目的供應商記錄一個記錄,每個供應商在該特定時間都顯示其等級。排名在[Amount]之上,最低排名第一。

因此,對於上面的例子,我希望的完整記錄集如下;

Rank SupplierID Amount  Time 
----------------------------------------------------------------- 
1  1    99.50  2016-02-17 13:19:21.4107347 +00:00 
1  1    99.00  2016-02-17 15:00:40.1052771 +00:00 
1  2    98.00  2016-02-17 15:07:07.6283091 +00:00 
2  1    98.00  2016-02-17 15:07:07.6283091 +00:00 
1  1    95.00  2016-02-17 16:40:08.4895886 +00:00 
2  2    95.00  2016-02-17 16:40:08.4895886 +00:00 
1  3    94.50  2016-02-17 16:40:18.7326269 +00:00 
2  1    94.50  2016-02-17 16:40:18.7326269 +00:00 
3  2    94.50  2016-02-17 16:40:18.7326269 +00:00 
1  2    92.00  2016-02-17 16:40:44.0902749 +00:00 
2  3    92.00  2016-02-17 16:40:44.0902749 +00:00 
3  1    92.00  2016-02-17 16:40:44.0902749 +00:00 
----------------------------------------------------------------- 

有可能潛在地在表中的任何數目的[SupplierId]的,本實施例僅示出了三個。

我會包括我的查詢嘗試到目前爲止,但我已經花了大約8個小時,並沒有拿出任何半路體面的東西。我想避免動態SQL,我覺得有一個CTE或新的V12(SQL Server 2014等效)表達式可以做到這一點,但我一直無法找到它。或者,也許這只是一個我看不到的基本交叉連接。 (我有點兒希望寫出來可能會引發我的一些天才,但沒有喜悅)。

我已經做了我的盡職調查,並閱讀了遞歸CTE的數據透視表,使用動態語句和窗口函數,但我沒有取得任何進展,所以任何幫助或指針都將非常感激。

+1

我不遵循您的示例結果。第一次間隔你是如何確定排名的?此時供應商1有99.5,而供應商2和3尚未收到金額。所以我想你決定把供應商1作爲第一等級,但在第二個時間間隔內,你處於完全相同的情況(供應商1接收另一個數量,供應商2和3沒有任何數量),但是你的排名會改變。你的示例集有可能存在錯誤還是我誤解? – fqhv

+0

是的,一些表和示例數據以及所需的輸出如何。正如發佈,這只是不明確。 –

+0

@fqhv你說得很對,結果集中有錯誤。我修改了它,所以它應該是正確的。現在它更有意義嗎? – keithl8041

回答

1

繁榮。管理與子查詢。希望對你有幫助!

select rank() over(partition by t.time order by r.amount) as [Rank], 
r.supplierid, t.amount, r.amount as supplieramount, t.[time] from (
    select yt1.id, max(yt2.id) as lastamount 
    from #yourtable yt1 
    inner join #yourtable yt2 on yt2.id <= yt1.id 
    group by yt1.id, yt2.supplierid 
    ) as d 
inner join #yourtable t on t.id = d.id 
inner join #yourtable r on r.id = d.lastamount 
order by t.id, r.amount 
+0

這正是我所追求的 - 謝謝你,很好地完成了。它可以作爲一種享受,並且添加SupplierAmount是一項獎勵。順便說一句,我現在看到爲什麼如果我將一個CREATE模式與一些示例數據一起包含在內,爲什麼它會更有用,我會爲任何未來的SQL問題做到這一點。謝謝你的幫助! – keithl8041