2014-09-04 1 views
2

나는 샘플 데이터를 가지고 :집계는

내가 만에 ... 이웃이

을 유형 ID, (가치가 나에게 중요하지 않습니다) 각 유형에 대한 행을 계산 할
RowId TypeId Value 
    1  1 34 
    2  1 53 
    3  1 34 
    4  2 43 
    5  2 65 
    6  16 54 
    7  16 34 
    8  1 45 
    9  6 43 
    10  6 34 
    11  16 64 
    12  16 63 

TypeId Count 
    1  3 
    2  2 
    16  2 
    1  1 
    6  2 
    16  2 

어떻게 결과를 얻을 수 있습니까?

+2

정확하게 일치하는 SQL –

+0

네이버를 'rowid'로 정렬하면이 항목을 공유 할 수 있습니까? – keltar

+1

LAG 기능을 사용하여 각 그룹을 식별 할 필드를 만들 수 있습니다. http://stackoverflow.com/questions/16563581/increment-row-number-when-value-of-field-changes-in-oracle – Bulat

답변

3

이것은 당신이 변경되지 않은 값의 그룹 내에서 행의 COUNT 제공해야합니다 :

SELECT TypeId, grp, COUNT(*) FROM (
    SELECT RowId, TypeId , Value, gap, SUM(gap) over (ORDER BY RowId) grp 
    FROM (SELECT RowId, TypeId , Value, 
       CASE WHEN TypeId = lag(TypeId) over (ORDER BY RowId) 
        THEN 0 
        ELSE 1 
       END gap 
     FROM dummy 
    ) t 
) tt 
GROUP BY TypeId, grp; 

당신은 끝없는 하위 쿼리 흠 이상 함께 선호하는 경우 :

WITH dummy_with_groups AS (
    SELECT RowId, TypeId , Value, SUM(gap) OVER (ORDER BY RowId) grp 
    FROM (SELECT RowId, TypeId , Value, 
      CASE WHEN TypeId = lag(TypeId) OVER (ORDER BY RowId) 
      THEN 0 ELSE 1 END gap 
     FROM dummy) t 
) 
SELECT TypeId, COUNT(*) as Result 
FROM dummy_with_groups 
GROUP BY TypeId, grp; 

http://www.sqlfiddle.com/#!6/f16e9/34

+0

'잘못된 구문이 나옵니다 ')''- 거의 마지막')'http://www.sqlfiddle.com/#!6/d7b47/1 –

+0

좋은 대답 +1! – Rachcha

+0

잘 계산되었지만 불행하게도 재주문합니다. '6'은 첫 번째 '16'보다 낮아야합니다. –

3

확인이 fiddle demo. 귀하의 컬럼 이름을 조금 변경했습니다.

WITH myCTE AS 
     (SELECT row_id, 
       type_id, 
       ROW_NUMBER() OVER (PARTITION BY type_id ORDER BY row_id) 
        AS cnt, 
       CASE LEAD (type_id) OVER (ORDER BY row_id) 
        WHEN type_id THEN 0 
        ELSE 1 
       END 
        AS show 
      FROM dummy), 
    innerQuery AS 
     (SELECT row_id, type_id, cnt 
      FROM myCTE 
      WHERE show = 1) 
SELECT iq1.type_id, iq1.cnt - ISNULL (iq2.cnt, 0) CNT 
    FROM innerQuery iq1 
     LEFT OUTER JOIN innerQuery iq2 
      ON  iq1.type_id = iq2.type_id 
       AND EXISTS 
         (SELECT 1 
         FROM innerQuery iq3 
         WHERE  iq3.type_id = iq1.type_id 
           AND iq3.row_id < iq1.row_id 
         HAVING MAX (iq3.row_id) = iq2.row_id) 

출력이 예상대로입니다.

+0

출력은'3, 2, 2, 4, 2, 4' 그리고 '3, 2, 2, 1, 2, 2'이어야합니다. –

+0

여기에 바이올린과 코드를 편집했습니다. 확인해주십시오. – Rachcha

+0

예, 예, 예! 그것은 나를 위해 지금 일합니다. –

관련 문제