2015-07-13 112 views
-1

我已經在我的數據庫提供以下資料:T-SQL:搜索子查詢

Docnr Weight1 Weight2 
    F4879 479,43 484,62 
    F6463 505,43 509,62 
    F6464 505,43 509,62 
    F8461 531,43 535,62 
    F9716 532,43 561,62 
    F6461 533,43 561,62 
    F6137 609,43 613,62 
    F9843 609,43 613,62 
    F9764 635,43 613,62 

現在我想作爲輸出這樣一個額外的列「警告」:

Docnr Weight1 Weight2 Warning 
    F4879 479,43 484,62 1 
    F6463 505,43 509,62 2 
    F6464 505,43 509,62 1 
    F8461 531,43 535,62 3 
    F9716 532,43 561,62 2 
    F6461 533,43 561,62 1 
    F6137 609,43 613,62 2 
    F9843 609,43 613,62 1 
    F9764 635,43 613,62 

計算「警告「: Warning = number of rows ahead where value(Weight2) <= value(Weight1)

例如:

Column 'Warning' in row 1 is 1 because 
    Check 484,62 <= 505,43: Yes -> 1 row ahead  
    Column 'Warning' in row 2 is 2 because 
    Check 509,62 <= 505,43: No 
    Check 509,62 <= 531,43: Yes -> 2 rows ahead 
    Column 'Warning' in row 4 is 3 because 
    Check 535,62 <= 532,43: No 
    Check 535,62 <= 533,43: No 
    Check 535,62 <= 609,43: Yes -> 3 rows ahead 

有沒有人有線索如何寫我的聲明輸出上述結果?

+2

那你試試這麼遠嗎?請顯示一些努力,SO不是代碼生成器服務。一個提示開始:'CASE ... WHEN' – Pred

+0

'Warning'列如何獲取值?邏輯? – Ravi

+0

此查詢是更大查詢的一部分。這部分我真的不知道如何在SELECT中編寫語句。同事們建議我循環使用計數器。這不是我懶得搜索解決方案... 列'警告'是計算列 – Jan

回答

0

子查詢應該工作,但需要一個順序列作爲基準

declare @t table (Docnr varchar(10), weight1 float, weight2 float) 

insert into @t 
values 
('F4879', 479.43, 484.62), 
('F6463', 505.43, 509.62), 
('F6464', 505.43, 509.62), 
('F8461', 531.43, 535.62), 
('F9716', 532.43, 561.62), 
('F6461', 533.43, 561.62), 
('F6137', 609.43, 613.62), 
('F9843', 609.43, 613.62), 
('F9764', 635.43, 613.62) 


;with r as 
(
    select Docnr, weight1, weight2 
     , ROW_NUMBER() over(order by weight1) as nbr 
    from @t 
) 

select r0.nbr, min(r.nbr) - r0.nbr 
from r as r0 join r on r0.weight2 < r.weight1 
group by r0.nbr 
+0

thanx男人,這就是我一直在尋找。找不到我自己的 – Jan