0

私はこのようなSQLテーブルを持っています:

id      pNum
-----   --------
100     12
100     13
100     15
100     16
100     17
200     18
200     19
300     20
300     21
300     25

id と pNum シーケンスでグループ化し、行数を数えたいと思います。このような結果になりました。

id      res
-----   --------
100     2
100     3
200     2
300     2
300     1

それを行う方法について何か考えはありますか?

4

2 に答える 2

4

DBMSがウィンドウ関数をサポートしている場合(SQL Server 2005以降など)

SELECT id,
       count(*) AS res
FROM   (SELECT *,
               [pNum] - ROW_NUMBER() OVER (PARTITION BY [id] ORDER BY [pNum]) AS Grp
        FROM   YourTable) T
GROUP  BY id,
          Grp 

SQLフィドル

于 2013-02-07T15:44:49.057 に答える
2

この質問の解決策を使用する:

declare @table table
(
    id int
    , pnum int
)


insert into @table
values (100,    12)
, (100,     13)
, (100,     15)
, (100,     16)
, (100,     17)
, (200,     18)
, (200,     19)
, (300,     20)
, (300,     21)
, (300,     25)

;WITH numbered AS (
  SELECT
    ID, pnum,
    SeqGroup = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY pnum) - pnum
  FROM @table
)
SELECT
  ID,
  COUNT(*) AS res
FROM numbered
GROUP BY ID, SeqGroup
ORDER BY id, MIN(pnum)
于 2013-02-07T15:52:45.340 に答える