2017-10-02 25 views
-1

1から90000のシーケンス番号を持つテーブルがあります したがって、シーケンス番号に値を自動的に割り当てる方法を知りたがっています たとえば1から1000のように1000バケツ以下になる 2000バケツ以下で1001から2000まで など、最大90000レコード。SQLクエリのシーケンス番号の集約

+0

あなたはSQL Serverの 'SEQUENCE'オブジェクトを指していますか? – Dai

+0

私は1,2という値を持つシーケンスとして名前のついたフィールドを持っています....90000、その値のために私は1から1000のようなグループでデータを割り当てる必要があります1000と1001から2000は2000の下に落ちる必要がありますなど – sweety

+0

あなたの質問は全く明確ではありません。これについて他の人の視点から考える。ここで何をしたいのか分かりません。 –

答えて

1

あなたは、1000で割り、床にそれを、そして1000で、それをバック掛けることができます:

SELECT 1000*FLOOR(num/1000) + 1, COUNT(*) 
FROM  mytable 
GROUP BY FLOOR(num/1000) 
+0

私はこれが私が探しているものだと思っていない、私はそれをこの方法で欲しいと思うMureinik 1000から1000として表示される必要があります1001から2000それは2000年まででなければならないので、最大90000まで、 – sweety

+0

@sweety私が編集して固定した1つのエラー。それがあなたが意味するものでない場合は、あなたの質問を編集して実際の結果を追加して、それがより明確になるようにしてください。 – Mureinik

+0

select * from function(1,1000,1000) 共用体 select * from fucntion(1001,2000,2000)ここでは、最初の値が開始点、2番目の値が終了点、3番目の値がバケット内のアイテム私はそれが90000までそれをしたい – sweety

0

次のコードは、それがCEILINGと文字通り0から90Kに働くアルゴリズムを使用して、あなたは何をしたいんあなたは小数ラウンドが0

テストデータ

declare @tbl table(num decimal) 
insert into @tbl 
select 1 union 
select 999 union 
select 1000 union 
select 1001 union 
select 2001 union 
select 3001 union 
select 9999 union 
select 10000 union 
select 10001 union 
select 15001 union 
select 25001 union 
select 77006 union 
select 80000 union 
select 90000 
に設定されているintを使用している場合 NUMがDECIMAL でなければならないことを考えます

それは浮気だようなクエリ

SELECT distinct 
num, 
CASE WHEN num <= 10000 THEN 1000*CEILING(num/1000) 
    WHEN num <= 20000 THEN 10000 + 1000*CEILING((num-10000)/1000) 
    WHEN num <= 30000 THEN 20000 + 1000*CEILING((num-20000)/1000) 
    WHEN num <= 40000 THEN 30000 + 1000*CEILING((num-30000)/1000) 
    WHEN num <= 50000 THEN 40000 + 1000*CEILING((num-40000)/1000) 
    WHEN num <= 60000 THEN 50000 + 1000*CEILING((num-50000)/1000) 
    WHEN num <= 70000 THEN 60000 + 1000*CEILING((num-60000)/1000) 
    WHEN num <= 80000 THEN 70000 + 1000*CEILING((num-70000)/1000) 
    WHEN num <= 90000 THEN 80000 + 1000*CEILING((num-80000)/1000) 
    ELSE 0 
    END 
FROM  @tbl 

結果

1  1000 
999  1000 
1000 1000 
1001 2000 
2001 3000 
3001 4000 
9999 10000 
10000 10000 
10001 11000 
15001 16000 
25001 26000 
77006 78000 
80000 80000 
90000 90000 
+0

これは私を助けたVictor – sweety

+0

@スウィーティー、それが助けてくれたことを知ってよかったので、私たちが誰かを助けるために正しい答えとしてマークしてください。 –

1

Modulo (%)オペレータがこのような何かのために最適です... そう簡単に、それは感じています。

WITH 
    cte_n1 (n) AS (SELECT 1 FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n (n)), 
    cte_n2 (n) AS (SELECT 1 FROM cte_n1 a CROSS JOIN cte_n1 b), 
    cte_n3 (n) AS (SELECT 1 FROM cte_n2 a CROSS JOIN cte_n2 b), 
    Sequense (n) AS (
     SELECT TOP 90000 
      ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 
     FROM 
      cte_n3 a CROSS JOIN cte_n3 b 
     ) 
SELECT 
    SequenseNumber = s.n, 
    GroupNumber = s.n - (s.n % 1000) 
FROM 
    Sequense s; 

結果...

SequenseNumber  GroupNumber 
-------------------- -------------------- 
1     0 
2     0 
3     0 
4     0 
5     0 
6     0 
......................... 
997     0 
998     0 
999     0 
1000     1000 
1001     1000 
1002     1000 
1003     1000 
1004     1000 
1005     1000 
1006     1000 
1007     1000 
1008     1000 
1009     1000 
1010     1000 
......................... 
89990    89000 
89991    89000 
89992    89000 
89993    89000 
89994    89000 
89995    89000 
89996    89000 
89997    89000 
89998    89000 
89999    89000 
90000    90000 

(90000 rows affected) 
0

私は何ジェイソンが掲示するOPが探しているものであると仮定するつもりです。これはちょうどこのタイプのもののために開発されたgetnumsABを使ったわずかなバリエーションです。

select rn, n1, n2 from dbo.getnumsAB(0,90000,1000,1); 

これが返されます:

rn n1  n2 
----- -------- -------- 
1  0  1000 
2  1000  2000 
3  2000  3000 
4  3000  4000 
.... 
87 86000 87000 
88 87000 88000 
89 88000 89000 
90 89000 90000 
私の解決策最初のノートこのクエリを理解するために

サンプル・データ

if object_id('tempdb..#yourdata') is not null drop table #yourdata; 
select SequenceNumber = rn 
into #yourdata 
from dbo.GetNumsAB(1,90000,1,1); 
create unique clustered index uq_cl_yourdata on #yourdata(SequenceNumber); 

:まず、我々はいくつかのサンプルデータを作成するために使用します

解決策

select y.SequenceNumber, GroupNumber = n1 
from #yourdata y 
join dbo.getnumsAB(0,90000,1000,1) gn 
    on y.SequenceNumber >= n1 and y.SequenceNumber < n2; 
0

私が何かを紛失していない場合は、単にケースステートメントを使用していませんか?

選択の場合 = 1000シーケンス< その後、 '1000' ときシーケンス< = 2000> = 1001 し、 '2000'

というように9000まで?

+0

Sequence <= 1000の場合はシーケンスを選択し、Sequence <= 2000、Sequence> = 1001の場合は '1000'、次に '2000' – Will