1

以下の表でソートされたサブグループの数を数えたいと思います。

id  nmb
1   11
2   12
3   13
4   22
5   23
6   31
7   32
8   33
9   11
10  12
11  13
12  12
13  13
14  21
15  22
16  11
17  12
18  13
19  14

そして、postgresql 8.4 で次のようなものを取得したい:

id  nmb local  
1   11  1  
2   12  1  
3   13  1  
4   22  1  
5   23  1  
6   31  1  
7   32  1  
8   33  1  
9   11  2  
10  12  2  
11  13  2  
12  12  3  
13  13  3  
14  21  3  
15  22  3  
16  11  4  
17  12  4  
18  13  4  
19  14  4 

編集:「ローカル」列の最後の数桁が間違っていました。訂正しました!

ありがとうございました。

4

3 に答える 3

1

SQL フィドル

select
    id, nmb,
    row_number() over(partition by nmb order by id)
from t
order by id
于 2013-09-17T18:56:56.207 に答える
1

グループを列挙しようとしているようです。ここで、グループは前の行 (順序nmbで定義された「前」) よりも低い値で始まります。id

アイデアは、を使用してグループの開始を識別することlag()です。次に、累積合計を取得して、必要なグループ識別子を取得します。

select id, nmb, sum(StartFlag) over (order by id) as local
from (select id, nmb,
             lag(nmb) over (order by id) as lastnmb,
             (case when lag(nmb) over (order by id) < nmb then 0
                   else 1
              end) as StartFlag
      from t
     ) t
order by id;
于 2013-09-17T19:41:40.733 に答える