我才刚刚开始使用C#进行编码,并且需要一些方向来实现C#(LINQ)中分区上的SQL Rank
我从数据库中检索了以下数据,并将SQL结果存储在c#中的数据表中。列“分数”必须与代码中的系数相乘,因此我无法执行SQL排名。我需要按分数的降序对分区[ID1,ID2]中的SKU进行排名。 SQL等效项是:
选择ID1,ID2,SKU, 排名()超过(按ID1,ID2顺序按得分desc划分)为[排名]
结果集
获得排名后,我最终需要获取特定SKU的排名分布(例如s1)以及整个结果中的相应收入分布。
Select SKU,
Rank,
count(*)
sum (revenue)
from prev_result
SKU RANK OCCURENCE REVENUE
s1 1 2 400
s1 2 xx yy
任何帮助都会大有裨益。
答案 0 :(得分:0)
尝试以下操作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DataTable dt1 = new DataTable();
dt1.Columns.Add("ID1", typeof(string));
dt1.Columns.Add("ID2", typeof(string));
dt1.Columns.Add("SKU", typeof(string));
dt1.Columns.Add("Revenue", typeof(int));
dt1.Columns.Add("Score", typeof(int));
dt1.Rows.Add(new object[] { "A", "a", "s1", 1000, 100});
dt1.Rows.Add(new object[] { "A", "a", "s2", 2000, 200 });
dt1.Rows.Add(new object[] { "A", "a", "s3", 1500, 150 });
dt1.Rows.Add(new object[] { "B", "b", "s1", 3000, 55 });
dt1.Rows.Add(new object[] { "B", "b", "s2", 200, 67 });
dt1.Rows.Add(new object[] { "B", "b", "s4", 1000, 99 });
var groups = dt1.AsEnumerable()
.GroupBy(x => new { ID1 = x.Field<string>("ID1"), ID2 = x.Field<string>("ID2"), })
.OrderByDescending(x => x.Sum(y => y.Field<int>("Score")))
.Select((x, i) => new { SKU = string.Join(",", x.Select(y => y.Field<string>("SKU")).OrderBy(y => y).Distinct()), Rank = i + 1, OCCURANCE = x.Count(), REVENUE = x.Sum(y => y.Field<int>("REVENUE")) })
.ToList();
}
}
}