需要使用当前行和上一行的比较进行以下输出

时间:2016-06-17 09:00:25

标签: sql sql-server sql-server-2008-r2

我正在使用SQL Server 2008R2。我有以下表格的配置文件名称和T1作为列名称,我需要根据某些条件添加另外两列t2和t3

Profile Name     T1      T2     T3
----------------------------------      
IP Singles        0
IP Singles       90
IP Singles      100
Disputes        180
IP Multis       145
Performance     378
IP Color        420
Disputes        170
IP Multis       104
Insurance       340
Insurance       120
Insurance      1335

T2和T3列的条件如下:

对于T2:

When T1 < 900 And
 Current row of Profile Name <> Previuos row of Profil Name then output of T2 will be same as T1 Else it will be 0.

对于T3:

When T1 <= 900 And Current row of Profile Name = Previous row of Profile Name then output of T3 will be same as T1 Else it will be 0.

例如:

  • 如果T1大于900并且ProfileName的当前行不等于ProfileName的上一行,则T2的值将为T1 Else 0.

  • 同样,如果T1大于或等于900并且ProfileName的当前行等于ProfileName的上一行,则T3的值将为T1 Else 0.

我的预期产量低于:

Profile Name    T1   T2   T3
--------------------------------
IP Singles        0    0    0               
IP Singles       90    0   90
IP Singles      100    0  100
Disputes        180  180    0
IP Multis       145  145    0
Performance     378  378    0
IP Color        420  420    0
Disputes        170  170    0
IP Multis       104  104    0
Insurance       340  340    0
Insurance       120    0  120
Insurance      1335    0    0

我希望我清楚这个问题,请帮助我用SELECT查询来实现该输出。

2 个答案:

答案 0 :(得分:3)

这可以在ROW_NUMBER()和CTE:

的帮助下完成
;WITH cte AS (
SELECT  [Profile Name], 
        T1,
        ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as RN
FROM YourTable
)


SELECT  c1.[Profile Name],
        c1.T1,
        CASE WHEN c1.T1 < 900 AND c1.[Profile Name] != c2.[Profile Name] THEN c1.T1 ELSE 0 END as T2,
        CASE WHEN c1.T1 <= 900 AND c1.[Profile Name] = c2.[Profile Name] THEN c1.T1 ELSE 0 END as T3
FROM cte c1
LEFT JOIN cte c2
    ON c1.RN = c2.RN +1

输出:

Profile Name    T1      T2  T3
IP Singles      0       0   0
IP Singles      90      0   90
IP Singles      100     0   100
Disputes        180     180 0
IP Multis       145     145 0
Performance     378     378 0
IP Color        420     420 0
Disputes        170     170 0
IP Multis       104     104 0
Insurance       340     340 0
Insurance       120     0   120
Insurance       1335    0   0

答案 1 :(得分:1)

在较新版本的SQL Server中,您可以使用LAG函数来访问上一行中的数据。在SQL Server 2008中,尚不支持此功能。

解决方法是使用自连接,其中连接条件为:链接副本1的行n,副本2的第n + 1行。

但是,在这两种情况下,你需要一些方法来指定表的顺序:表不是排序列表,所以为了以某种顺序运行它你需要一个额外的列(你没有&# 39; t提到)带有序列号或某些排序条件(例如ORDER BY&#34; Profile Name&#34;,T1),这些当前不是您的订单。

- 彼得·范罗罗斯·ABIS培训&amp;咨询。