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语句