2017-03-01 25 views
1

我有A和B列。我需要按以下方式對列A進行分組:2 & 3,5 & 6,8 10一起基於B列中的值。列A始終是遞增1到10.我有問題在SQL中找到一種方法,因爲它們具有相同的B值(1.4),因此分組編號分別爲5 & 6和8 10。我想將增量A值組合在一起(5,6,8,9,10由於缺少7而不增量)。感謝任何幫助。謝謝。SQL查詢如何分組相同的結果wihin增量鍵RANK

A B 
1 1.0 
2 1.1 
3 1.1 
4 1.3 
5 1.4 
6 1.4 
7 1.45 
8 1.4 
9 1.4 
10 1.4 
+0

請出示預期的輸出。 –

+0

A B 1 1.0 2-3 1.1 4 1.3 5-6 1.4 7 1.45 8-10 1.4 – antbithia

回答

1

這是一個gaps-and-islands類型的問題,因爲你不想只是B組,您只需要通過連續B相對於A組。

rextester:http://rextester.com/UEE36579

select 
    minA = min(a) 
    , maxA = max(a) 
    , B 
    , rnk = dense_rank() over (order by min(a)) 
from (select a, b 
    , rn_a = row_number() over (order by a) 
    , rn_b = row_number() over (partition by b order by a) 
from t) as cte 
group by B, rn_b - rn_a 
order by minA, b 

回報:

+------+------+------+-----+ 
| minA | maxA | B | rnk | 
+------+------+------+-----+ 
| 1 | 1 | 1.00 | 1 | 
| 2 | 3 | 1.10 | 2 | 
| 4 | 4 | 1.30 | 3 | 
| 5 | 6 | 1.40 | 4 | 
| 7 | 7 | 1.45 | 5 | 
| 8 | 10 | 1.40 | 6 | 
+------+------+------+-----+ 
+0

這個偉大工程,可你還可以添加MAXA。謝謝。 – antbithia

+0

@antbithia添加了'maxA' – SqlZim

0

轉儲與所述分組的指示符的臨時表...

INSERT INTO #TempTable(ColA, ColB, GroupCol) 
 
SELECT A, 
 
     B, 
 
     CASE 
 
      WHEN A = 1 THEN 1 
 
      WHEN A = 2 OR A = 3 THEN 2 
 
      WHEN A = 4 THEN 4 
 
      WHEN A = 5 or A = 6 THEN 5 
 
      WHEN A = 7 THEN 6 
 
      WHEN A = 8 OR A= 9 or A = 10 THEN 7 
 
      ELSE NULL 
 
     END AS GroupCol 
 
FROM OrginalTable

<table> 
 
<tr> 
 
    <th>ColA</th> 
 
    <th>ColB</th> 
 
    <th>GroupCol</th> 
 
</tr> 
 
<tr> 
 
    <td>1</td> 
 
    <td>1.0</td> 
 
    <td>1</td> 
 
</tr> 
 
<tr> 
 
    <td>2</td> 
 
    <td>1.1</td> 
 
    <td>2</td> 
 
</tr> 
 
<tr> 
 
    <td>3</td> 
 
    <td>1.1</td> 
 
    <td>2</td> 
 
</tr> 
 
<tr> 
 
    <td>4</td> 
 
    <td>1.3</td> 
 
    <td>4</td> 
 
</tr> 
 
<tr> 
 
    <td>5</td> 
 
    <td>1.4</td> 
 
    <td>5</td> 
 
</tr> 
 
<tr> 
 
    <td>6</td> 
 
    <td>1.4</td> 
 
    <td>5</td> 
 
</tr> 
 
<tr> 
 
    <td>7</td> 
 
    <td>1.45</td> 
 
    <td>6</td> 
 
</tr> 
 
<tr> 
 
    <td>8</td> 
 
    <td>1.4</td> 
 
    <td>7</td> 
 
</tr> 
 
<tr> 
 
    <td>9</td> 
 
    <td>1.4</td> 
 
    <td>7</td> 
 
</tr> 
 
<tr> 
 
    <td>10</td> 
 
    <td>1.4</td> 
 
    <td>7</td> 
 
</tr> 
 
</table>

的,你可以使用 「分組依據」 使用groupCol

+0

您的解決方案假定我們事先知道這些值。但是,這應該被編碼爲適用於任何數據集。謝謝 – antbithia