You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中是否存在等效于SQL DENSE_RANK()窗口函数的实现?

背景示例

假设我们有如下数据表:

Customer | Product
Dave     | Sneakers
Martin   | Tooth Brush
Andrew   | Shirt
Dave     | Tooth Brush

在SQL中,我们可以通过DENSE_RANK()生成密集排名,以此将数据拆分到关联表中,比如执行以下查询:

SELECT Customer, Product, 
       DENSE_RANK() OVER (ORDER BY Customer) AS customer_id, 
       DENSE_RANK() OVER (ORDER BY Product) AS product_id

查询结果如下:

Customer | Product      | customer_id | product_id
Dave     | Sneakers     |  2          | 2
Martin   | Tooth Brush  |  3          | 3
Andrew   | Shirt        |  1          | 1
Dave     | Tooth Brush  |  2          | 3

这种方式常用于将数据拆分到三张关联表的场景:

Customer (customer_id, customer_name)
Product (product_id, product_name)
Customer_Product(customer_id, product_id)

问题

请问C中是否有能实现类似SQL DENSE_RANK()功能的函数?若将C中包含对应各列字段的结构范围视为SQL表的等效物,该如何实现?

给出的解决方案(存在编译问题)

问题关闭后提供了一段尝试实现该功能的代码,但在g++14中无法编译,原因是代码需要从tuple隐式转换为pair,当前编译器版本不支持该操作:

#include <vector>
#include <set>
#include <unordered_map>
#include <ranges>
using namespace std;

int main(){
    const vector<int> v = {7,9,9,7};
    const auto dense_rank = views::zip(v | ranges::to<set>(),views::iota(0)) | ranges::to<unordered_map>() ;
    return 0;
}

核心实现思路总结

实际上,我们可以利用std::set存储去重后的值,再通过迭代器计算密集排名——具体来说,某个值的密集排名等于从set起始迭代器到该值对应迭代器的距离,即:

dense_rank = distance(begin(your_set), it);

内容的提问来源于stack exchange,提问作者Ludovic Aubert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:13:20