1

我有 A 和 B 列。我需要用以下方式对 A 列进行分组:2&3、5&6、8&9&10 基于 B 列中的值。A 列始终从 1 到 10 递增。我在 SQL 中找到一种方法来分别对 5&6 和 8&9&10 进行分组时遇到问题,因为它们具有相同的 B 值(1.4)。我想将增量 A 值组合在一起(由于缺少 7,5、6、8、9、10 不是增量值)。感谢任何帮助。谢谢。

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  
4

2 回答 2

1

这是一个差距和岛屿类型的问题,因为您不想只分组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 |
+------+------+------+-----+
于 2017-03-01T18:34:47.323 回答
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 使用“分组依据”

于 2017-03-01T18:57:39.230 回答