mysql - 无法理解如何在不通过幼稚的 sql 方法使用 row_num() 的情况下强加它,而 rank 和 dense_rank 有效
问题描述
我有以下数据集:
mysql> select * from covid_test order by Country, Confirmed;
+------+---------+-----------+
| SNO | Country | Confirmed |
+------+---------+-----------+
| 19 | China | 0 |
| 1 | China | 1 |
| 7 | China | 2 |
| 9 | China | 4 |
| 78 | China | 4 |
| 12 | China | 5 |
| 3 | China | 6 |
| 26 | China | 9 |
| 35 | China | 10 |
| 2 | China | 14 |
| 6 | China | 26 |
| 14 | China | 444 |
| 77 | India | 15 |
+------+---------+-----------+
下面对 rank 和 dense_rank 的查询工作正常,但是我无法查询 row_num,我的所有策略都失败了:
mysql> select ct.*, (select count(distinct Confirmed)+1 from covid_test ct1 where ct1.Country = ct.Country and ct1.Confirmed < ct.Confirmed and ct1.SNO <> ct.SNO) as densernk from covid_test ct order by Country, Confirmed;
+------+---------+-----------+--------+
| SNO | Country | Confirmed | densernk |
+------+---------+-----------+--------+
| 19 | China | 0 | 1 |
| 1 | China | 1 | 2 |
| 7 | China | 2 | 3 |
| 9 | China | 4 | 4 |
| 78 | China | 4 | 4 |
| 12 | China | 5 | 5 |
| 3 | China | 6 | 6 |
| 26 | China | 9 | 7 |
| 35 | China | 10 | 8 |
| 2 | China | 14 | 9 |
| 6 | China | 26 | 10 |
| 14 | China | 444 | 11 |
| 77 | India | 15 | 1 |
mysql> select ct.*, (select count(distinct SNO) from covid_test ct1 where ct1.Country = ct.Country and ct1.Confirmed < ct.Confirmed and ct1.SNO <> ct.SNO) as rnk from covid_test ct order by Country, Confirmed;
+------+---------+-----------+------+
| SNO | Country | Confirmed | rnk |
+------+---------+-----------+------+
| 19 | China | 0 | 0 |
| 1 | China | 1 | 1 |
| 7 | China | 2 | 2 |
| 9 | China | 4 | 3 |
| 78 | China | 4 | 3 |
| 12 | China | 5 | 5 |
| 3 | China | 6 | 6 |
| 26 | China | 9 | 7 |
| 35 | China | 10 | 8 |
| 2 | China | 14 | 9 |
| 6 | China | 26 | 10 |
| 14 | China | 444 | 11 |
| 77 | India | 15 | 0 |
+------+---------+-----------+------+
如何为同一组实现 row_num?
解决方案
您还必须检查条件ct1.Confirmed = ct.Confirmed
,在这种情况下,您必须计算行数ct1.SNO < ct.SNO
:
select ct.*,
(
select count(*) + 1
from covid_test ct1
where ct1.Country = ct.Country
and (
ct1.Confirmed < ct.Confirmed
or (ct1.Confirmed = ct.Confirmed AND ct1.SNO < ct.SNO)
)
) as row_num
from covid_test ct
order by Country, Confirmed;
请参阅演示。
推荐阅读
- android - 如何从我的设备获取内存类型信息?
- java - Gradle 覆盖默认检查任务
- docker - Kaniko:如何使用 Tekton 在 Kubernetes 中缓存来自 Gatsby 构建的文件夹?
- swift - 如何在swift中调用mac API“添加新事件”?
- python - 不满足可选依赖项:安装 igraph 和 leidenalg 以使用所选功能
- html - 不透明的 GIF 变透明
- arrays - 在 BigQuery 中选择除 ARRAY_AGG + STRUCT 中的一列之外的所有内容
- c - 如果在同一个套接字上设置多个连接,哪个套接字描述符接收数据?
- python - Pandas Dataframe(内部)加入同一个 Dataframe
- node.js - MongoDB 领域 BadChangeSet 错误:无法验证上传变更集:ProtocolErrorCode=212