SQL Sequential Grouping和序列间隙的字符串

Bau*_*sie 5 sql sql-server sql-server-2012

我正在尝试使用SQL 2012基于以下数据生成特定字符串

| Id | Activity | Year | 
|----|----------|------|
| 01 |  AAAAA   | 2008 |
| 01 |  AAAAA   | 2009 |
| 01 |  AAAAA   | 2010 |
| 01 |  AAAAA   | 2012 |
| 01 |  AAAAA   | 2013 |
| 01 |  AAAAA   | 2015 |
| 01 |  BBBBB   | 2014 |
| 01 |  BBBBB   | 2015 |
Run Code Online (Sandbox Code Playgroud)

结果需要看起来像;

| 01 |  AAAAA   | 2008-2010, 2012-2013, 2015 |
| 01 |  BBBBB   | 2014-2015                  |
Run Code Online (Sandbox Code Playgroud)

任何关于如何实现这一点的想法将不胜感激.

Fel*_*tan 6

用于ROW_NUMBER连续年份FOR XML PATH('')字符串连接进行分组.

SQL小提琴

WITH Cte AS(
    SELECT *,
        grp = year - ROW_NUMBER() OVER(PARTITION BY id, activity ORDER BY year)
    FROM tbl
)
SELECT 
    id,
    activity,
    x.years
FROM Cte c
CROSS APPLY(
    SELECT STUFF((
        SELECT ', ' + CONVERT(VARCHAR(4), MIN(year)) +
            CASE 
                WHEN MIN(year) <> MAX(year) THEN '-' + CONVERT(VARCHAR(4), MAX(year))
                ELSE ''
            END
        FROM Cte
        WHERE
            id = c.id
            ANd activity = c.activity
        GROUP BY id, activity, grp
        FOR XML PATH('')
    ), 1, 2, '')
)x(years)
GROUP BY id, activity, x.years
Run Code Online (Sandbox Code Playgroud)

结果:

| id | activity |                      years |
|----|----------|----------------------------|
| 01 |    AAAAA | 2008-2010, 2012-2013, 2015 |
| 01 |    BBBBB |                  2014-2015 |
Run Code Online (Sandbox Code Playgroud)

  • 恭喜@FelixPamittan,很棒的答案! (2认同)