用于对数据进行分组的SQL查询

用于对数据进行分组的SQL查询,sql,sql-server,group-by,Sql,Sql Server,Group By,我有一个数据集,如下所示 Code Values 521 1 522 1 523 1 524 0 525 0 526 1 527 1 我希望得到如下输出: Group CD Values G1 521-523 1 G2 524-525 0 G3 52

我有一个数据集,如下所示

Code          Values
521            1
522            1
523            1
524            0
525            0
526            1
527            1
我希望得到如下输出:

Group     CD        Values
G1      521-523       1
G2      524-525       0
G3      526-527       1
尝试使用LEAD、ROW_NUMBER和Conditional聚合:

SELECT 'G' + ROUND((p.rnk + 1) / 2) as group,
       MAX(CASE WHEN p.rnk%2 = 1 THEN p.code END) + '-' +
       MAX(CASE WHEN p.rnk%2 = 0 THEN p.code END) 
FROM (
    SELECT s.*,
           ROW_NUMBER() OVER(ORDER BY s.code) as rnk
    FROM (
        select t.*,
               LEAD(t.values,1) OVER(ORDER BY t.code DESC) as last_val
        FROM YourTable t) s
    WHERE s.values <> s.last_val ) p
GROUP BY 'G' + ROUND((p.rnk + 1) / 2)

我倾向于使用行号差异法:

select concat('G', row_number() over (order by min(value)) as grp,
       concat(min(code), '-', max(code)) as codes,
       value
from (select t.*,
             row_number() over (order by code) as seqnum_c,
             row_number() over (partition by value order by code) as seqnum_vc
      from t
     ) t
group by value, (seqnum_c - seqnum_vc);
尝试以下解决方案:

DECLARE @YourTable TABLE (Code INT, Value INT)

INSERT INTO @YourTable
VALUES
(521,1),
(522,1),
(523,1),
(524,0),
(525,0),
(526,1),
(527,1)

;WITH CTE AS
(
    SELECT  *, ROW_NUMBER() OVER(ORDER BY CODE) - ROW_NUMBER() OVER(PARTITION BY Value Order BY CODE) Grp
    FROM    @YourTable
)
SELECT  ROW_NUMBER() OVER(ORDER BY(SELECT MIN(Code))) Grp
        ,CAST(MIN(Code) AS VARCHAR(30)) +'-'+ CAST(MAX(Code) AS VARCHAR(30)) CD
        ,MAX(Value) Val
FROm    CTE
GROUP   BY Grp

这个问题很相似,可能会帮助你:太棒了……这个解决方案很有帮助。