-1

我刚开始用 C# 编写代码,需要一些指导来实现 C# 中的 SQL Rank over partition (LINQ)

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

选择ID1,ID2,SKU,Rank() over (partition by ID1,ID2 order by score desc)作为[Rank]

结果集

结果集

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

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

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

任何帮助都会大有裨益。

4

1 回答 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();

        }
    }
}
于 2019-12-15T11:36:38.800 回答