2015-07-13 161 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