복붙노트

[SQL] 시퀀스 만 행을 SQL 기

SQL

시퀀스 만 행을 SQL 기

나는 다음과 같은 테이블이 말 :

MyTable
---------
| 1 | A |
| 2 | A |
| 3 | A |
| 4 | B |
| 5 | B |
| 6 | B |
| 7 | A |
| 8 | A |
---------

나는 출력 다음에 SQL 쿼리가 필요합니다 :

---------
| 3 | A |
| 3 | B |
| 2 | A |
---------

나는 기본적으로 만 순서에서 함께있는 행에 대한 그룹을하고 있어요. 어떤 아이디어?

참고 데이터베이스가 SQL 서버 2008에 있는지가 오라클의 지연 () 함수를 사용하지만이 주제에 대한 게시물이 있습니다.

해결법

  1. ==============================

    1.이 작업은 "섬"문제로 알려져있다. Itzik 벤 웨이 코 뮤니시의 접근 방식을 사용 :

    이 작업은 "섬"문제로 알려져있다. Itzik 벤 웨이 코 뮤니시의 접근 방식을 사용 :

    ;WITH YourTable AS
    (
    SELECT 1 AS N, 'A' AS C UNION ALL
    SELECT 2 AS N, 'A' AS C UNION ALL
    SELECT 3 AS N, 'A' AS C UNION ALL
    SELECT 4 AS N, 'B' AS C UNION ALL
    SELECT 5 AS N, 'B' AS C UNION ALL
    SELECT 6 AS N, 'B' AS C UNION ALL
    SELECT 7 AS N, 'A' AS C UNION ALL
    SELECT 8 AS N, 'A' AS C
    ),
         T
         AS (SELECT N,
                    C,
                    DENSE_RANK() OVER (ORDER BY N) - 
                    DENSE_RANK() OVER (PARTITION BY C ORDER BY N) AS Grp
             FROM   YourTable)
    SELECT COUNT(*),
           C
    FROM   T
    GROUP  BY C,
              Grp 
    ORDER BY MIN(N)
    
  2. ==============================

    2.이 당신을 위해 작동합니다 ...

    이 당신을 위해 작동합니다 ...

    SELECT 
      Total=COUNT(*), C 
    FROM 
    (
     SELECT 
     NGroup = ROW_NUMBER() OVER (ORDER BY N) - ROW_NUMBER() OVER (PARTITION BY C ORDER BY N),
     N,
     C
     FROM MyTable 
    )RegroupedTable
    GROUP BY C,NGroup
    
  3. ==============================

    3.그냥 재미를 위해, 어떤 SQL 특정 기능없이 NOT은 ID 열이 일정하게 증가하는 것을 가정 :

    그냥 재미를 위해, 어떤 SQL 특정 기능없이 NOT은 ID 열이 일정하게 증가하는 것을 가정 :

    WITH starters(name, minid, maxid) AS (
        SELECT
            a.name, MIN(a.id), MAX(a.id)
        FROM
            mytable a RIGHT JOIN
            mytable b ON
                (a.name <> b.name AND a.id < b.id) 
        WHERE 
            a.id IS NOT NULL
        GROUP BY 
            a.name
    ),
    both(name, minid, maxid) AS (
        SELECT
            name, minid, maxid
        FROM
            starters
        UNION ALL
        SELECT
            name, MIN(id), MAX(id)
        FROM
            mytable
        WHERE
            id > (SELECT MAX(maxid) from starters)
        GROUP BY
            name
    )
    SELECT
        COUNT(*), m.name, minid
    FROM 
        both INNER JOIN 
        mytable m ON
            id BETWEEN minid AND maxid
    GROUP BY
        m.name, minid
    

    합니다 (midid 열 무시) 결과 :

    (No column name)    name    minid
    3   A   1
    3   B   4
    2   A   7
    
  4. from https://stackoverflow.com/questions/4324623/sql-group-by-only-rows-which-are-in-sequence by cc-by-sa and MIT license