不同结果使用SQL在表中连续记录

时间:2016-09-28 10:33:25

标签: sql-server database tsql

我有以下表定义和样本数据。在下表中。 “TP”连续3次记录2次,然后“SL”连续1次记录2次......

id | Result
1  | TP
2  | TP
3  | TP
4  | SL
5  | TP
6  | NONE
7  | NONE
8  | SL
9  | TP
10 | TP
11 | TP
12 | SL
13 | SL
14 | SL

我正在寻找这样的结果:

comboNum | num
TP_3     | 2
SL_1     | 2
TP_1     | 1
SL_3     | 1

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

Declare @tblTest AS TABLE(
    ID INT,
    Result VARCHAR(50)
)

INSERT INTO @tblTest VALUES(1,'TP')
,(2,'TP')
,(3,'TP')
,(4,'SL')
,(5,'TP')
,(6,'NONE')
,(7,'NONE')
,(8,'SL')
,(9,'TP')
,(10,'TP')
,(11,'TP')
,(12,'SL')
,(13,'SL')
,(14,'SL')

;WITH X AS
(
    SELECT 
        T.*,
        ROW_NUMBER() OVER (ORDER BY ID) AS SrNo,
        ROW_NUMBER() OVER (PARTITION BY Result ORDER BY id) AS PartNo           
    FROM @tblTest T 
    WHERE Result<>'NONE'    
)   
SELECT
    ComboNum,
    COUNT(Occurance) AS Num
FROM
(
    SELECT          
            Result +'_'+ CAST((max(ID)-min(ID))+1 AS VARCHAR(5)) AS ComboNum,
            (MAX(ID)-MIN(ID))+1 AS Occurance,
            MIN(SrNo) AS SrNo           
    FROM X
    GROUP BY Result, (SrNo - PartNo)    
) Z
GROUP BY ComboNum,Occurance
ORDER BY MIN(SrNo)

<强>输出:

enter image description here

答案 1 :(得分:0)

您可以如下

DECLARE @Tbl TABLE (Id INT, Result VARCHAR(10))
INSERT INTO @Tbl
VALUES  
(1,'TP')
,(2,'TP')
,(3,'TP')
,(4,'SL')
,(5,'TP')
,(6,'NONE')
,(7,'NONE')
,(8,'SL')
,(9,'TP')
,(10,'TP')
,(11,'TP')
,(12,'SL')
,(13,'SL')
,(14,'SL')

;WITH CTE1
AS
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY Result, Id) RowId FROM @Tbl
),CTE2
AS
(
    SELECT      
        Result,
        MAX(C.Id) -  MIN(C.Id) Cons,
        MIN(C.Id) StartP,
        MAX(C.Id) EndP
    FROM
        CTE1 C
    WHERE
        c.Result <> 'NONE'
    GROUP BY    
        C.Result,   
        C.RowId - C.Id
)

SELECT 
    C.Result + '_' + CAST(C.Cons + 1 AS VARCHAR(50)) AS comboNum,
    COUNT(*) AS Num
FROM 
    CTE2 C
GROUP BY
    C.Result,
    C.Cons
ORDER BY Num DESC

结果:

comboNum           Num
------------------ -----------
TP_3               2
SL_1               2
TP_1               1
SL_3               1

答案 2 :(得分:0)

两个带有棘手的ROW_NUMBER()序列的CTE:

;WITH cte as (
    SELECT  id, 
            Result,
            ROW_NUMBER() OVER (PARTITION BY Result ORDER BY id) - ROW_NUMBER() OVER (ORDER BY id) as seq
    FROM YourTable
    WHERE Result != 'NONE'
), final AS (
    SELECT  MIN(id) as mid,
            Result +'_'+ CAST(MAX(id)-MIN(id)+1 as nvarchar(max)) as comboNum    
    FROM cte
    GROUP BY Result, seq
)

SELECT  comboNum,
        COUNT(mid) as num
FROM final
GROUP BY comboNum
ORDER BY MIN(mid)

输出:

comboNum    num
TP_3        2
SL_1        2
TP_1        1
SL_3        1