统计每条记录中的最大连续值

原贴地址:http://topic.csdn.net/u/20100410/15/c03f52b8-1ce5-4b85-afed-a15e5450ca6e.html?42506

 

表有ID CA D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18 D19 D20 等22个字段
现统计D1-D20(由任意字母组成)最大的连值写如CA字段中。
第一条记录的最大连值为4,是从D6-D9都为相同的字母B;
第二条记录的最大连值为6,是从D3-D8都为相同的字母R;
第三条记录的最大连值为5,是从D15-D19都为相同的字母N;
如表所示
ID CA D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18 D19 D20  
1 4 A B B C C B B B B A A A E E G G F F T W  
2 6 G G R R R R R R A A C C T T F F F F H H
3 5 T G G M M M P P L L C A G Q N N N N N B

 

/*------------------------------------------------------------------
--  Author : htl258(Tony)
--  Date   : 2010-04-10 17:38:30
--  Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
    Jul  9 2008 14:43:34
    Copyright (c) 1988-2008 Microsoft Corporation
    Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)

------------------------------------------------------------------
*/
--> 生成测试数据表:tb

IF OBJECT_ID('[tb]') IS NOT NULL
   
DROP TABLE [tb]
GO
CREATE TABLE [tb]([ID] INT,[CA] INT,[D1] NVARCHAR(10),[D2] NVARCHAR(10),[D3] NVARCHAR(10),[D4] NVARCHAR(10),[D5] NVARCHAR(10),[D6] NVARCHAR(10),[D7] NVARCHAR(10),[D8] NVARCHAR(10),[D9] NVARCHAR(10),[D10] NVARCHAR(10),[D11] NVARCHAR(10),[D12] NVARCHAR(10),[D13] NVARCHAR(10),[D14] NVARCHAR(10),[D15] NVARCHAR(10),[D16] NVARCHAR(10),[D17] NVARCHAR(10),[D18] NVARCHAR(10),[D19] NVARCHAR(10),[D20] NVARCHAR(10))
INSERT [tb]
SELECT 1,NULL,'A','B','B','C','C','B','B','B','B','A','A','A','E','E','G','G','F','F','T','W' UNION ALL
SELECT 2,NULL,'G','G','R','R','R','R','R','R','A','A','C','C','T','T','F','F','F','F','H','H' UNION ALL
SELECT 3,NULL,'T','G','G','M','M','M','P','P','L','L','C','A','G','Q','N','N','N','N','N','B'
GO
--SELECT * FROM [tb]

-->SQL查询如下:
IF OBJECT_ID('[FN_GETNUM]') IS NOT NULL
   
DROP FUNCTION [FN_GETNUM]
GO
CREATE FUNCTION FN_GETNUM(@ID INT)
RETURNS INT
AS
BEGIN
   
DECLARE @T TABLE(A VARCHAR(20),B INT)
   
INSERT @T(A)
   
SELECT A
   
FROM TB
        UNPIVOT(A
FOR B IN(
           
[D1],[D2],[D3],[D4],[D5],[D6],[D7],[D8],[D9],[D10],[D11],
           
[D12],[D13],[D14],[D15],[D16],[D17],[D18],[D19],[D20]
            )) B
    
WHERE ID=@ID
   
DECLARE @I INT,@J VARCHAR(20)
   
UPDATE @T SET
        B
= @I,
       
@I = CASE WHEN @J = A THEN @I +1 ELSE 1 END,
       
@J = A
   
RETURN(SELECT MAX(B) FROM @T)
END
GO

UPDATE TB SET [CA]= DBO.FN_GETNUM([ID])

SELECT * FROM TB
/*
ID    CA    D1    D2    D3    D4    D5    D6    D7    D8    D9    D10    D11    D12    D13    D14    D15    D16    D17    D18    D19    D20
1    4    A    B    B    C    C    B    B    B    B    A    A    A    E    E    G    G    F    F    T    W
2    6    G    G    R    R    R    R    R    R    A    A    C    C    T    T    F    F    F    F    H    H
3    5    T    G    G    M    M    M    P    P    L    L    C    A    G    Q    N    N    N    N    N    B
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值