1

SQL 列を調べているときに、重複する値が見つかった場合は、1 からカウントをインクリメントする必要があります。

列「Filenum」にある元の値と一致する任意の値。

出力では次のようになります。

-------------------------------
| FILENUM coulmn | num column | 
| a              |          1 |
| a              |          2 |
| a              |          3 |
| b              |          1 |
| b              |          2 |
| c              |          1 |
| d              |          1 |
| a              |          4 |
| b              |          3 | 
-------------------------------

あなたが提案できる解決策..row_number()のような関数を避けることができれば、さらに良いでしょう..advに感謝します

4

2 に答える 2

1

シーケンス テーブルを使用して、各重複に対して増分番号を取得できます。シーケンス テーブルには、必要と思われる最大値まで増加する数値を持つ単一のフィールドがあります。

私は通常、一般的な使用のために100万行のシーケンステーブルを作成します。あなたの場合、重複があるだけの行が必要になります。この例では、100 行を追加します。

CREATE TABLE dbo.Sequence
(
    seq_nbr INT NOT NULL,
    CONSTRAINT PK$Sequence
        PRIMARY KEY CLUSTERED (seq_nbr)
        WITH FILLFACTOR = 100,
    CONSTRAINT Sequence$seq_nbr$positive CHECK (seq_nbr > 0)
)
GO
INSERT INTO dbo.Sequence (seq_nbr)
SELECT ten * 10 + unit + 1
FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS Units(unit)
     CROSS JOIN
     (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS Tens(ten)

シーケンス テーブルを使用してテーブルとクロス結合し、重複カウンターを取得します。

SELECT  letter
       ,seq_nbr 
FROM    dbo.Sequence
       ,dbo.Duplicates
GROUP BY letter
       ,seq_nbr 
HAVING  seq_nbr <= COUNT(letter)

結果を与える:

letter seq_nbr 
------ -------
a            1
a            2
a            3
a            4
b            1
b            2
b            3
c            1
d            1

結果を示すSQL Fiddleを次に示します。

于 2013-11-25T12:08:53.597 に答える
0

Row_Number()orを SQL Server で使用したくない場合はDense_Rank()、次のことが必要になる場合があります。

  • 現在のデータを自動インクリメントで一時テーブルにプルします

  • そこから各値の現在の合計を取得します

それ以外の場合、これは SQL サーバーに操作できます。

set @rno:=0; set @names:='';
select @rno:=case when @names<>names then  1
else @rno+1 end as rno, @names:=names as names
from demo order by names;

期待される出力:

rno   names
1       a             -- '' <> a , rno = 1
2       a             -- a = a, rno = 1 + 1 so on...
3       a
4       a
1       b
2       b
1       c
1       d

SQLFIDDLEで試してみましたが、うまくいきます:)

于 2013-01-19T09:11:42.427 に答える