SQL查询如何对增量键RANK中的相同结果进行单独分组

Posted

技术标签:

【中文标题】SQL查询如何对增量键RANK中的相同结果进行单独分组【英文标题】:SQL query how to group separately same results wihin incremental keys RANK 【发布时间】:2017-03-01 18:27:23 【问题描述】:

我有 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  

【问题讨论】:

请显示预期的输出。 A B 1 1.0 2-3 1.1 4 1.3 5-6 1.4 7 1.45 8-10 1.4 【参考方案1】:

这是一个gaps-and-islands 类型的问题,因为您不想只按B 分组,您只想按相对于A 的连续B 分组。

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 |
+------+------+------+-----+

【讨论】:

@antbithia 添加了maxA【参考方案2】:

转储到带有分组指示符的临时表中...

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 使用“分组依据”

【讨论】:

您的解决方案假定我们事先知道这些值。但是,这应该被编码为适用于任何数据集。谢谢

以上是关于SQL查询如何对增量键RANK中的相同结果进行单独分组的主要内容,如果未能解决你的问题,请参考以下文章

mysql如何查询一个字段里面相同的两条数据。如库名为s,表名为task,字段名为rank。请写一段这样的sql语句

oracle sql rank函数取排序值

sql查询结果中有id相同的字段如何对查询结果进行操作将id相同的合并为一条数据

增量 SQL 查询

如何根据单独列中的月份和年份参数对 DB2 结果进行排序

SQL 如何对数据库中相同名称的表中数据进行批量修改