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
相关产品推荐
相关产品推荐

