SQL分区到C#Linq的排名

问题描述 投票:0回答:1

我刚刚开始使用C#进行编码,并且需要一些指导以实现C#(LINQ)中的分区上的SQL等级

我已经从数据库中检索了以下数据,并将SQL结果存储在c#中的数据表中。列“分数”必须与代码中的系数相乘,因此我无法执行SQL排名。我需要按分数的降序对分区[ID1,ID2]中的SKU进行排名。 SQL等效项是:

选择ID1,ID2,SKU,排名()超过(按ID1,ID2按得分desc划分分区)为[排名]

结果集

The result set

一旦有了排名,我最终需要获得特定SKU的排名分布(例如s1)以及整个结果中的相应收入分布。

Select SKU, 
       Rank, 
      count(*) 
      sum (revenue) 
from prev_result

SKU    RANK    OCCURENCE   REVENUE                                                             
s1       1        2          400                                                             
s1       2        xx         yy                                                     

任何帮助都会大有裨益。

c# sql linq partition sql-rank
1个回答
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(); } } }

© www.soinside.com 2019 - 2024. All rights reserved.